package modchest.mixin; import modchest.REServerMod; import modchest.util.ServerPlayerEntityInterface; import net.minecraft.nbt.NbtCompound; import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Arrays; @Mixin(ServerPlayerEntity.class) public abstract class ServerPlayerEntityMixin implements ServerPlayerEntityInterface { @Unique private NbtCompound dataSaver = new NbtCompound(); //Weil die nbt daten beim tod geloescht werden, muessen sie rueber kopiert werden; der neue nbtTag existiert aber noch nciht, daher muessen sie hier zwischengespeichert werden @Override public NbtCompound getDataSaver() { //Um errors zu vermeiden, sorgt er dafuer, dass es immer ein persistentData gibt if (this.dataSaver == null) { this.dataSaver = new NbtCompound(); } return this.dataSaver; } @Override public void setDataSaver(NbtCompound data) { //Um errors zu vermeiden, sorgt er dafuer, dass es immer ein persistentData gibt this.dataSaver = data; } @Inject(method = "writeCustomDataToNbt", at = @At("TAIL")) public void writeCustomDataToNbt(NbtCompound nbt, CallbackInfo ci) { //Immer wenn eine andere Methode aufruft, dass Daten abgespeichert werden sollen, tun wir das jetzt auch if (dataSaver != null) { //wenn der dataSaver null ist, wuerde sonst ein Error kommen, weil Minecraft keine leeren NBTs absepeicheern kann :( try { nbt.put("REServerMod", this.dataSaver); } catch (Exception e) { REServerMod.LOGGER.info("Error while saving custom NBt-Data: " + e); } } else { REServerMod.LOGGER.info("write failed! This probably means, that the player hasn't set a custom spanpoint yet"); } } @Inject(method = "readCustomDataFromNbt", at = @At("TAIL")) public void readCustomDataFromNbt(NbtCompound nbt, CallbackInfo ci) { //gleiches beim einlesen. Werden NBT-Daten eingelesen, tun wird das auch try { dataSaver = (NbtCompound) nbt.get("REServerMod"); } catch (Exception e) { REServerMod.LOGGER.info("Error while saving custom NBt-Data: " + e); } //REServerMod.LOGGER.info("readCustomDataFromNbt called with following Data: " + Arrays.toString(nbt.getIntArray("REServerMod.sleep_data"))); } @Inject(method = "copyFrom", at = @At("TAIL")) public void copyFrom(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo ci) { //Beim Tod des Spielers werden die NBT-Daten kopiert, damit die Spawnpunkte nicht verloren gehen, kopieren wir sie auch mit rueber dataSaver = ((ServerPlayerEntityInterface) oldPlayer).getDataSaver(); //REServerMod.LOGGER.info("copyFrom called"); } }