From 527ea812dbd4384bafeaaad4bf8098dec2faac11 Mon Sep 17 00:00:00 2001 From: Malte Reents Date: Tue, 23 Jan 2024 16:18:50 +0100 Subject: [PATCH] checking destroyed bed improved MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenn das bett zerstört wird, wird ggf. die abzugleichende Koordinate ans kopfende verschoben --- src/main/java/modchest/mixin/bedBlock.java | 32 ++++++++++++++++++- .../util/setAndGetMultiButtonsSpawn.java | 20 ++++++------ 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/main/java/modchest/mixin/bedBlock.java b/src/main/java/modchest/mixin/bedBlock.java index 29ad343..bc1fc19 100644 --- a/src/main/java/modchest/mixin/bedBlock.java +++ b/src/main/java/modchest/mixin/bedBlock.java @@ -16,6 +16,7 @@ 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 { @@ -23,6 +24,35 @@ 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 nciht auf dem CLient rechnet 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++; + player.sendMessage(Text.of("east")); + break; + case "west": + posBedX--; + player.sendMessage(Text.of("west")); + break; + case "south": + posBedZ++; + player.sendMessage(Text.of("south")); + break; + case "north": + posBedZ--; + player.sendMessage(Text.of("north")); + break; + default: + player.sendMessage(Text.of(bedData.split("facing=")[1].split(",")[0])); + break; + } + } + setAndGetMultiButtonsSpawn setAndGet = new setAndGetMultiButtonsSpawn(); //Damit die Mehtoden 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 @@ -38,7 +68,7 @@ public class bedBlock { } catch (Exception e) { REServerMod.LOGGER.info("Error casting playerArray to ServerPlayerEntity: " + e); } - if (inRange(pos.getX(), posXYZ[0], 2) && inRange(pos.getY(), posXYZ[1], 2) && inRange(pos.getZ(), posXYZ[2], 2)) { //TODO: change range to 1 //Gleicht ab, ob die Koordinaten uebereinstimmen; die Spawnpunkte sind nicht immer ganz sauber, daher wird in Blockrange 1 geschaut + if (posBedX == posXYZ[0] && posBedY == posXYZ[1] && posBedZ == posXYZ[2]) { //TODO: change range to 1 //Gleicht ab, ob die Koordinaten uebereinstimmen; die Spawnpunkte sind nicht immer ganz sauber, daher wird in Blockrange 1 geschaut 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) { diff --git a/src/main/java/modchest/util/setAndGetMultiButtonsSpawn.java b/src/main/java/modchest/util/setAndGetMultiButtonsSpawn.java index bfc08de..4afaf9e 100644 --- a/src/main/java/modchest/util/setAndGetMultiButtonsSpawn.java +++ b/src/main/java/modchest/util/setAndGetMultiButtonsSpawn.java @@ -119,19 +119,21 @@ public class setAndGetMultiButtonsSpawn { if (subNbt != null) { NbtCompound nbt = (NbtCompound) subNbt.get("vanillaSpawnData"); //hollt sich die daten - assert nbt != null; - if (!nbt.getBoolean("used")) { - nbt.putBoolean("used", true); //setzt den verwendet boolean auf true; nicht ganz perfekt, sollte ein fehler beim speichern auftreten wird es nicht nochmal versucht, speichert aber massiv an coding und leistung - subNbt.put("vanillaSpawnData", nbt); - topNbt.put("multi_sleep", subNbt); //muss den bearbeiteten nbt wieder abgespeichert (nur der boolean wurde ueberschrieben) - castedPlayer.setDataSaver(topNbt); - return nbt; //gibt den nbt-tag an die aufrufende Methode - } else { - return null; + if (nbt != null) { + if (!nbt.getBoolean("used")) { + nbt.putBoolean("used", true); //setzt den verwendet boolean auf true; nicht ganz perfekt, sollte ein fehler beim speichern auftreten wird es nicht nochmal versucht, speichert aber massiv an coding und leistung + subNbt.put("vanillaSpawnData", nbt); + topNbt.put("multi_sleep", subNbt); //muss den bearbeiteten nbt wieder abgespeichert (nur der boolean wurde ueberschrieben) + castedPlayer.setDataSaver(topNbt); + return nbt; //gibt den nbt-tag an die aufrufende Methode + } else { + return null; + } } } else { return null; } + return null; } public synchronized void setMultiSpawnBlank(ServerPlayerEntity player, int spawn) { //wird aufgerufen wenn das Bett dieses Spielers zerstoert wurde