LuizB Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 Bem, estou fazendo um plugin que vai ser necessário salvar a metadata de blocos quando o servidor desligar, gostaria de saber qual a melhor maneira de salvar. Link para o comentário Compartilhar em outros sites More sharing options...
zAth Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 Hum, como faço pra serializar ? Acho que o Location tem um método .toString() mas iria ficar com coisa inútil. faz um método ae do jeito Location location = ...; String serializedLocation = location.getWorld().getName() + ";" + location.getX() + ";" + location.getY() + ";" + location.getZ(); 1 Link para o comentário Compartilhar em outros sites More sharing options...
zAth Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 (editado) Serializa a localização do bloco, e salva essa String + a metadata em algum lugar. Quando ligar o servidor carrega todas as localizações + as suas metadatas, dai você pega cada localização e o seu bloco e coloca a sua metadata. Editado Junho 17, 2017 por zAth Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 17, 2017 Autor Denunciar Compartilhar Postado Junho 17, 2017 Serializa a localização do bloco, e salva essa String + a metadata em algum lugar. Quando ligar o servidor carrega todas as localizações + as suas metadatas, dai você pega cada localização e o seu bloco e coloca a sua metadata. Hum, como faço pra serializar ? Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 17, 2017 Autor Denunciar Compartilhar Postado Junho 17, 2017 Acho que o Location tem um método .toString() mas iria ficar com coisa inútil. faz um método ae do jeito Location location = ...; String serializedLocation = location.getWorld().getName() + ";" + location.getX() + ";" + location.getY() + ";" + location.getZ(); Entendi, mas são inúmeros blocos, como seria pra deserializar ? Link para o comentário Compartilhar em outros sites More sharing options...
zAth Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 Entendi, mas são inúmeros blocos, como seria pra deserializar ? Location location = ...; String serializedLocation = location.getWorld().getName() + ";" + location.getX() + ";" + location.getY() + ";" + location.getZ(); String worldName = serializedLocation.split(";")[0]; World world = getServer().getWorld(worldName); int x = Integer.parseInt(serializedLocation.split(";")[1]); int y = Integer.parseInt(serializedLocation.split(";")[2]); int z = Integer.parseInt(serializedLocation.split(";")[3]); Location location1 = new Location(world, x, y, z); 1 Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 17, 2017 Autor Denunciar Compartilhar Postado Junho 17, 2017 Location location = ...; String serializedLocation = location.getWorld().getName() + ";" + location.getX() + ";" + location.getY() + ";" + location.getZ(); String worldName = serializedLocation.split(";")[0]; World world = getServer().getWorld(worldName); int x = Integer.parseInt(serializedLocation.split(";")[1]); int y = Integer.parseInt(serializedLocation.split(";")[2]); int z = Integer.parseInt(serializedLocation.split(";")[3]); Location location1 = new Location(world, x, y, z); Deu erro ao deserializar código: private void loadMachines() { if (mcdata.getConfig().getConfigurationSection("Maquinas") != null) { for (String s : mcdata.getConfig().getConfigurationSection("Maquinas").getKeys(false)) { String serializedLocation = s; String worldName = serializedLocation.split("=")[0]; World world = getServer().getWorld(worldName); int x = Integer.parseInt(serializedLocation.split("=")[1]); int y = Integer.parseInt(serializedLocation.split("=")[2]); int z = Integer.parseInt(serializedLocation.split("=")[3]); Location location1 = new Location(world, x, y, z); Block maquina = location1.getBlock(); // Nessa linha aponta o erro maquina.setMetadata("Maquina", new FixedMetadataValue(this, true)); maquinas.add(maquina); } } } Estou chamando metodo no onEnable, o estranho é que quando eu dou reload com o plugman ele funciona normalmente. Já coloquei pra dar um broadcast nas coordenadas, só que não apareceu nada, mas quando eu dou reload com o plugman, funciona perfeitamente. Erro: [17:40:22] [Server thread/ERROR]: Error occurred while enabling Maquinas v1.0 (Is it up to date?) java.lang.NullPointerException at org.bukkit.Location.getBlock(Location.java:87) ~[PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at me.cuthmf.machines.Maquinas.loadMachines(Maquinas.java:62) ~[?:?] at me.cuthmf.machines.Maquinas.onEnable(Maquinas.java:25) ~[?:?] at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:359) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:318) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at net.minecraft.server.v1_8_R3.MinecraftServer.s(MinecraftServer.java:408) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at net.minecraft.server.v1_8_R3.MinecraftServer.k(MinecraftServer.java:372) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at net.minecraft.server.v1_8_R3.MinecraftServer.a(MinecraftServer.java:327) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:267) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:563) [PaperSpigot188.jar:git-PaperSpigot-"8b18730"] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121] Link para o comentário Compartilhar em outros sites More sharing options...
leonardosc Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 (editado) Se você não levar em consideração carregar na memoria apenas os blocos no qual as chunks estão carregadas, você pode fazer assim: // A key será hash do x, y, z do bloco. Use Objects.hashCode // O valor será os metadados, nesse caso coloquei uma map, no qual a key seria a chave do metadado e o valor seria o valor ,-, Map<Integer, Map<String, Object>> metadata = ...; // Ai é só usar serialização pra salvar... // Salvar ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("arquivo.dat")); out.writeObject(metadata); out.close(); // Ler ObjectInputStream in = new ObjectInputStream(new FileInputStream("arquivo.dat")); Map<Integer, Map<String, Object>> metadata2 = (Map<Integer, Map<String, Object>>) in.readObject(); // metadata lida in.close(); Claro que seria melhor carregar apenas os blocos das chunks que estão carregadas, e descarregar quando as chunks fossem descarregadas... mas isso seria mais complexo de se fazer... Editado Junho 17, 2017 por leonardosc Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 17, 2017 Autor Denunciar Compartilhar Postado Junho 17, 2017 Se você não levar em consideração carregar na memoria apenas os blocos no qual as chunks estão carregadas, você pode fazer assim: // A key será hash do x, y, z do bloco. Use Objects.hashCode // O valor será os metadados, nesse caso coloquei uma map, no qual a key seria a chave do metadado e o valor seria o valor ,-, Map<Integer, Map<String, Object>> metadata = ...; // Ai é só usar serialização pra salvar... // Salvar ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("arquivo.dat")); out.writeObject(metadata); out.close(); // Ler ObjectInputStream in = new ObjectInputStream(new FileInputStream("arquivo.dat")); Map<Integer, Map<String, Object>> metadata2 = (Map<Integer, Map<String, Object>>) in.readObject(); // metadata lida in.close(); Claro que seria melhor carregar apenas os blocos das chunks que estão carregadas, e descarregar quando as chunks fossem descarregadas... mas isso seria mais complexo de se fazer... Não entendi. como vou salvar o bloco ? Link para o comentário Compartilhar em outros sites More sharing options...
leonardosc Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 Não entendi. como vou salvar o bloco ? Colocar int[] coords = { block.getX(), block.getY(), block.getZ() }; int hash = Arrays.hashCode(coords); metadata.put(hash, MAP COM OS METADADOS); Pegar int[] coords = { block.getX(), block.getY(), block.getZ() }; int hash = Arrays.hashCode(coords); Map<String, Object> metadadosDoBloco = metadada.get(hash); Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 17, 2017 Autor Denunciar Compartilhar Postado Junho 17, 2017 Colocar int[] coords = { block.getX(), block.getY(), block.getZ() }; int hash = Arrays.hashCode(coords); metadata.put(hash, MAP COM OS METADADOS); Pegar int[] coords = { block.getX(), block.getY(), block.getZ() }; int hash = Arrays.hashCode(coords); Map<String, Object> metadadosDoBloco = metadada.get(hash); Uma dúvida, Porque uma Map pra salvar as metadata ? já que a metada só é String Link para o comentário Compartilhar em outros sites More sharing options...
leonardosc Postado Junho 17, 2017 Denunciar Compartilhar Postado Junho 17, 2017 Uma dúvida, Porque uma Map pra salvar as metadata ? já que a metada só é String Não precisa. Fiz com Map pq vc pode salvar vários metadados, mas se vc só precisa salvar 1 pode usar string. 2 Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 18, 2017 Autor Denunciar Compartilhar Postado Junho 18, 2017 (editado) Não precisa. Fiz com Map pq vc pode salvar vários metadados, mas se vc só precisa salvar 1 pode usar string. Deu erro. @EDIT Descobri que o erro não era no código, e sim no plugin que estava sendo carregado primeiro que o mundo em que estava os blocos. Editado Junho 18, 2017 por Cuthmf Link para o comentário Compartilhar em outros sites More sharing options...
Gutyerrez Postado Junho 27, 2017 Denunciar Compartilhar Postado Junho 27, 2017 Sua dúvida foi marcada como [Resolvido] e movido à área de dúvidas resolvidas.Atenciosamente,Gamer's Board Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
LuizB
Bem, estou fazendo um plugin que vai ser necessário salvar a metadata de blocos quando o servidor desligar, gostaria de saber qual a melhor maneira de salvar.
Link para o comentário
Compartilhar em outros sites
13 respostass a esta questão
Posts Recomendados