169 lines
9.3 KiB
Java
169 lines
9.3 KiB
Java
|
package modchest.util;
|
||
|
|
||
|
import modchest.REServerMod;
|
||
|
import net.minecraft.nbt.NbtCompound;
|
||
|
import net.minecraft.nbt.NbtElement;
|
||
|
import net.minecraft.registry.RegistryKey;
|
||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||
|
import net.minecraft.text.Text;
|
||
|
import net.minecraft.util.math.BlockPos;
|
||
|
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<World> 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);
|
||
|
}
|
||
|
}
|
||
|
}
|