2024-01-21 10:09:48 +01:00
package modchest.util ;
import modchest.REServerMod ;
2024-01-22 09:46:03 +01:00
import net.minecraft.nbt.NbtCompound ;
import net.minecraft.nbt.NbtElement ;
2024-01-21 10:09:48 +01:00
import net.minecraft.server.network.ServerPlayerEntity ;
import net.minecraft.text.Text ;
2024-01-22 09:46:03 +01:00
import net.minecraft.util.math.BlockPos ;
import net.minecraft.util.registry.RegistryKey ;
import net.minecraft.world.World ;
2024-01-21 10:09:48 +01:00
public class setAndGetMultiButtonsSpawn {
public synchronized void setMultiSpawn ( ServerPlayerEntity player , int spawn ) {
2024-01-22 09:46:03 +01:00
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
2024-01-21 10:09:48 +01:00
}
2024-01-22 09:46:03 +01:00
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 ( ) ;
2024-01-21 10:09:48 +01:00
try {
2024-01-22 09:46:03 +01:00
assert 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
} catch ( Exception e ) {
2024-01-21 10:09:48 +01:00
REServerMod . LOGGER . info ( " Sorry! Error when saving Spawnpoint! Exception: " + e ) ;
2024-01-22 09:46:03 +01:00
player . sendMessage ( Text . translatable ( " chat.modchest.multispawn.spawnnotsaved " ) ) ;
2024-01-21 10:09:48 +01:00
}
}
public synchronized int [ ] getMultiSpawn ( ServerPlayerEntity player , int spawn ) {
2024-01-22 09:46:03 +01:00
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 + + ) {
2024-01-21 10:09:48 +01:00
tempArray [ i ] = 77889922 ; //Lueckenfueller; wird in deathScreenMultiButtonsC2SPacket uebrprueft und rausgefiltert
}
2024-01-22 09:46:03 +01:00
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 ) {
2024-01-21 10:09:48 +01:00
REServerMod . LOGGER . info ( " Sorry! Error when loading Spawnpoint! Exception: " + e ) ;
2024-01-22 09:46:03 +01:00
player . sendMessage ( Text . translatable ( " chat.modchest.multispawn.getable " ) ) ;
2024-01-21 10:09:48 +01:00
}
}
2024-01-22 09:46:03 +01:00
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
2024-01-21 10:09:48 +01:00
posXYZ [ 0 ] = 77889933 ;
posXYZ [ 1 ] = 77889933 ;
posXYZ [ 2 ] = 77889933 ;
}
return posXYZ ;
}
2024-01-22 09:46:03 +01:00
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
2024-01-23 16:18:50 +01:00
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 ;
}
2024-01-22 09:46:03 +01:00
}
} else {
return null ;
}
2024-01-23 16:18:50 +01:00
return null ;
2024-01-22 09:46:03 +01:00
}
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 ) ;
}
}
2024-01-21 10:09:48 +01:00
}