minecraft-mod/remappedSrc/modchest/mixin/bedBlock.java

89 lines
4.4 KiB
Java
Raw Normal View History

2024-07-07 16:17:55 +02:00
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<? extends PlayerEntity> 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);
}
}
}
}
}
}
}