package modchest.util; import modchest.REServerMod; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; public class setAndGetMultiButtonsSpawn { public synchronized void setMultiSpawn(ServerPlayerEntity player, int spawn) { ServerPlayerEntityInterface castedPlayer = (ServerPlayerEntityInterface) player; NbtCompound topNbt = ((ServerPlayerEntityInterface) player).getDataSaver(); //alle daten der mod werden in diesem NBT Gespeichert if (topNbt.get("multi_sleep") == null) { //die daten fuer multi-sleep werden in dem nbt-tag "multi_sleep" gespeichert, der wiederum um anderen nbt gespeichert wird topNbt.put("multi_sleep", new NbtCompound()); //sollte dieser nbt-tag nicht existieren, wird ein neuer erstellt } NbtCompound subNbt = (NbtCompound) topNbt.get("multi_sleep"); //nbt tag mit allen daten fuer multi-sleep wird geladen spawn--; //weil der Array mit Slot 0 beginnt, rutscht alles eins auf int[] fullArray = new int[3]; //ein kleiner zwischenspeicher fullArray[0] = (int) player.getX(); fullArray[1] = (int) player.getY(); fullArray[2] = (int) player.getZ(); try { if (subNbt != null) { subNbt.putIntArray(String.valueOf(spawn), fullArray); //speichert unseren array an der entsprechenden nummer ab topNbt.put("multi_sleep", subNbt); //speichert den tag unter multi_sleep im top-tag ab castedPlayer.setDataSaver(topNbt); //speichert den top-tag wieder im spieler ab } else { REServerMod.LOGGER.info("Error when trying to write spawn to file!"); player.sendMessage(Text.translatable("chat.modchest.multispawn.spawnnotsaved")); } } catch (Exception e) { REServerMod.LOGGER.info("Error when saving Spawnpoint! Exception: " + e); player.sendMessage(Text.translatable("chat.modchest.multispawn.spawnnotsaved")); } } public synchronized int[] getMultiSpawn(ServerPlayerEntity player, int spawn) { ServerPlayerEntityInterface castedPlayer = (ServerPlayerEntityInterface) player; NbtCompound topNbt = ((ServerPlayerEntityInterface) player).getDataSaver(); if (topNbt.get("multi_sleep") == null) { topNbt.put("multi_sleep", new NbtCompound()); } NbtCompound subNbt = (NbtCompound) topNbt.get("multi_sleep"); //wie bei setMultiSpawn() spawn--; //weil der Array mit Slot 0 beginnt, rutscht alles eins auf int[] fullArray = new int[0]; if (subNbt != null) { fullArray = subNbt.getIntArray(String.valueOf(spawn)); //holt sich den ganzen Array, mit allen gespeicherten Spawnpunkten; struktur wird etwas weiter unten erklaert } if (fullArray.length != 3) { //sollte der Array leer oder anderweitig ungueltig sein wird er neu erstellt int[] tempArray = new int[3]; for (int i = 0; i < 3; i++) { tempArray[i] = 77889922; //Lueckenfueller; wird in deathScreenMultiButtonsC2SPacket uebrprueft und rausgefiltert } try { //wenn wir gerade den Array erstellt haben, weil er ungueltig war, wird er hier in den nbt-tag abgespseichert subNbt.putIntArray(String.valueOf(spawn), fullArray); topNbt.put("multi_sleep", subNbt); castedPlayer.setDataSaver(topNbt); } catch (Exception e) { REServerMod.LOGGER.info("Sorry! Error when loading Spawnpoint! Exception: " + e); player.sendMessage(Text.translatable("chat.modchest.multispawn.getable")); } } fullArray = subNbt.getIntArray(String.valueOf(spawn)); //wir laden ihn uns wieder, nur um sicher zu gehen int[] posXYZ = new int[3]; //zwischenspeicher try { //schaut, ob wir die daten laden koennen posXYZ[0] = fullArray[0]; posXYZ[1] = fullArray[1]; posXYZ[2] = fullArray[2]; } catch (Exception e) { //sonst geben wir folgenden Errorcode zurueck posXYZ[0] = 77889933; posXYZ[1] = 77889933; posXYZ[2] = 77889933; } return posXYZ; } public synchronized void setMultiSpawnVanilla(ServerPlayerEntity player) { //bevor der Spieler respawnt, speichern wir einmal seinen Vanillaspawn ab, um ihn spaeter wieder darauf zu setzen BlockPos posAlt = player.getSpawnPointPosition(); //Spawnpunkt der Vanilla-respawn-funktion wird gespeichert RegistryKey dimAlt = player.getSpawnPointDimension();//Dimension " float angleAlt = player.getSpawnAngle(); //Blickrichtung " ServerPlayerEntityInterface castedPlayer = (ServerPlayerEntityInterface) player; NbtCompound topNbt = ((ServerPlayerEntityInterface) player).getDataSaver(); if (topNbt.get("multi_sleep") == null) { topNbt.put("multi_sleep", new NbtCompound()); } NbtCompound subNbt = (NbtCompound) topNbt.get("multi_sleep"); //alles in der set-Methode ganz oben erklaert try { //sicheerheit, weil hier mal wieder viel zwischen datentypen gewechselt wird NbtCompound vanillaSpawnData = new NbtCompound(); int[] location = new int[3]; //spawnpunkt wird in einen Array komprimiert location[0] = posAlt.getX(); location[1] = posAlt.getY(); location[2] = posAlt.getZ(); vanillaSpawnData.putIntArray("location", location); //und abgespeichert vanillaSpawnData.putString("dimension", dimAlt.toString()); //dimension wird abgespeichert vanillaSpawnData.putFloat("angle", angleAlt); //auch die Blickrichtung vanillaSpawnData.putBoolean("used", false); //wird auf true gesetzt, sobald der Spawnpunkt wieder zurueck gesetzt wurde subNbt.put("vanillaSpawnData", vanillaSpawnData); //spawnpunkt wird im sub-nbt gespeichert topNbt.put("multi_sleep", subNbt); //und im top-nbt castedPlayer.setDataSaver(topNbt); //um dann im player gespeichert zu werden } catch (Exception e) { REServerMod.LOGGER.info("Sorry! Error when saving Spawnpoint! Exception: " + e); } } public synchronized NbtCompound getMultiSpawnVanilla(ServerPlayerEntity player) { ServerPlayerEntityInterface castedPlayer = (ServerPlayerEntityInterface) player; NbtCompound topNbt = ((ServerPlayerEntityInterface) player).getDataSaver(); if (topNbt.get("multi_sleep") == null) { topNbt.put("multi_sleep", new NbtCompound()); } NbtCompound subNbt = (NbtCompound) topNbt.get("multi_sleep"); //steht alles wieder in der ersten methode if (subNbt != null) { NbtCompound nbt = (NbtCompound) subNbt.get("vanillaSpawnData"); //hollt sich die daten if (nbt != null) { if (!nbt.getBoolean("used")) { nbt.putBoolean("used", true); //setzt den verwendet boolean auf true; nicht ganz perfekt, sollte ein fehler beim speichern auftreten wird es nicht nochmal versucht, speichert aber massiv an coding und leistung subNbt.put("vanillaSpawnData", nbt); topNbt.put("multi_sleep", subNbt); //muss den bearbeiteten nbt wieder abgespeichert (nur der boolean wurde ueberschrieben) castedPlayer.setDataSaver(topNbt); return nbt; //gibt den nbt-tag an die aufrufende Methode } else { return null; } } } else { return null; } return null; } public synchronized void setMultiSpawnBlank(ServerPlayerEntity player, int spawn) { //wird aufgerufen wenn das Bett dieses Spielers zerstoert wurde ServerPlayerEntityInterface castedPlayer = (ServerPlayerEntityInterface) player; NbtCompound topNbt = ((ServerPlayerEntityInterface) player).getDataSaver(); if (topNbt.get("multi_sleep") == null) { topNbt.put("multi_sleep", new NbtCompound()); } NbtCompound subNbt = (NbtCompound) topNbt.get("multi_sleep"); //alles wieder wie in der ersten Methode; spawn--; //weil der Array mit Slot 0 beginnt, rutscht alles eins auf int[] fullArray = new int[0]; if (subNbt != null) { fullArray = subNbt.getIntArray(String.valueOf(spawn)); //holt sich den ganzen Array, mit allen gespeicherten Spawnpunkten; struktur wird etwas weiter unten erklaert } fullArray[0] = 77889944; //Errorcode der in deathScreenMultiButtonsC2SPacket als zerstoertes Bett rausgefiltert wird fullArray[1] = 77889944; fullArray[2] = 77889944; try { subNbt.putIntArray(String.valueOf(spawn), fullArray); //wird abgespeichert topNbt.put("multi_sleep", subNbt); castedPlayer.setDataSaver(topNbt); } catch (Exception e) { REServerMod.LOGGER.info("Sorry! Error when saving Spawnpoint! Exception: " + e); } } }