62 lines
3.0 KiB
Java
62 lines
3.0 KiB
Java
|
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");
|
||
|
}
|
||
|
}
|