89 lines
4.4 KiB
Java
Executable File
89 lines
4.4 KiB
Java
Executable File
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|