package modchest.mixin; import modchest.REServerMod; import modchest.util.setAndGetMultiButtonsSpawn; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import net.minecraft.block.BedBlock; 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; import java.util.List; import java.util.Objects; @Mixin(BedBlock.class) public class bedBlock { @Inject(method = "onBreak", at = @At("HEAD")) public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player, CallbackInfo ci) { //Ueberprueft, wenn ein Bett zerstoert wird, ob jemand dieses Bett als Spawnpunkt hat if (!world.isClient) { //Stellt sicher, dass das ganze nicht auf dem Client gerechnet wird, weil der Code sonst abstuertzt int posBedX = pos.getX(); int posBedY = pos.getY(); int posBedZ = pos.getZ(); String bedData = state.toString(); if (Objects.equals(bedData.split("part=")[1], "foot]")) { //das fussende wurde zerstoert, damit der Code also geht, muss in richtung kopfende eins gegangen werden switch (bedData.split("facing=")[1].split(",")[0]) { case "east": posBedX++; break; case "west": posBedX--; break; case "south": posBedZ++; break; case "north": posBedZ--; break; default: break; } } if (posBedX < 0) { //Es gibt leider einen rundungsfehler. Wenn Das Bett negative koordinaten hat, rundet es weg von der Null wahrend der Spieler richtung Null aufrundet posBedX++; } if (posBedY < 0) { posBedY++; } if (posBedZ < 0) { posBedZ++; } setAndGetMultiButtonsSpawn setAndGet = new setAndGetMultiButtonsSpawn(); //Damit die Methoden benutzt werden koennen, muss ein Objekt erstellt werden; ist aber egal, weil eh keine Daten in dieser Klasse gespeichert werden List playerArray = null; try { //Sollte der Code doch ausversehen auf dem Client ausgefuehrt werden, wuerde die folgende Zeile einen Error schmeissen playerArray = world.getPlayers(); //holt sich die liste aller Spieler auf dem server } catch (Exception e) { REServerMod.LOGGER.info("Error when trying to get players Array after Bed was destroyed: " + e); } for (int i = 0; i < playerArray.size(); i++) { //geht fuer jeden Spieler durch for (int j = 1; j <= 5; j++) { //und fuer alle Speicherslots dieser int[] posXYZ = new int[0]; try { //Sollte der Code doch ausversehen auf dem Client ausgefuehrt werden, wuerde die folgende Zeile einen Error schmeissen posXYZ = setAndGet.getMultiSpawn((ServerPlayerEntity) playerArray.get(i), j); } catch (Exception e) { REServerMod.LOGGER.info("Error casting playerArray to ServerPlayerEntity: " + e); } if (posBedX == posXYZ[0] && posBedY == posXYZ[1] && posBedZ == posXYZ[2]) { //Gleicht ab, ob die Koordinaten uebereinstimmen try { //Sollte der Code doch ausversehen auf dem Client ausgefuehrt werden, wuerde die folgende Zeile einen Error schmeissen setAndGet.setMultiSpawnBlank((ServerPlayerEntity) playerArray.get(i), j); //Wird ein bett zerstoert, wird der Spawnpunkt geblanked } catch (Exception e) { REServerMod.LOGGER.info("Error when trying to get players Array after Bed was destroyed: " + e); } } } } } } }