Ir para conteúdo
  • 0

Qual a melhor forma de salvar a metadata de um bloco


LuizB

Pergunta

13 respostass a esta questão

Posts Recomendados

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 por zAth
Link para o comentário
Compartilhar em outros sites

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

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();
Link para o comentário
Compartilhar em outros sites

 

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

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);
Link para o comentário
Compartilhar em outros sites

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

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 por leonardosc
Link para o comentário
Compartilhar em outros sites

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

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

 

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

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 por Cuthmf
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...