checking destroyed bed improved

Wenn das bett zerstört wird, wird ggf. die abzugleichende Koordinate ans kopfende verschoben
This commit is contained in:
Malte Reents 2024-01-23 16:18:50 +01:00
parent 49b67c2355
commit 527ea812db
2 changed files with 42 additions and 10 deletions

View File

@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
@Mixin(BedBlock.class) @Mixin(BedBlock.class)
public class bedBlock { public class bedBlock {
@ -23,6 +24,35 @@ public class bedBlock {
@Inject(method = "onBreak", at = @At("HEAD")) @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 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 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 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<? extends PlayerEntity> playerArray = null; List<? extends PlayerEntity> playerArray = null;
try { //Sollte der Code doch ausversehen auf dem Client ausgefuehrt werden, wuerde die folgende Zeile einen Error schmeissen 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) { } catch (Exception e) {
REServerMod.LOGGER.info("Error casting playerArray to ServerPlayerEntity: " + 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 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 setAndGet.setMultiSpawnBlank((ServerPlayerEntity) playerArray.get(i), j); //Wird ein bett zerstoert, wird der Spawnpunkt geblanked
} catch (Exception e) { } catch (Exception e) {

View File

@ -119,19 +119,21 @@ public class setAndGetMultiButtonsSpawn {
if (subNbt != null) { if (subNbt != null) {
NbtCompound nbt = (NbtCompound) subNbt.get("vanillaSpawnData"); //hollt sich die daten NbtCompound nbt = (NbtCompound) subNbt.get("vanillaSpawnData"); //hollt sich die daten
assert nbt != null; if (nbt != null) {
if (!nbt.getBoolean("used")) { 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 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); subNbt.put("vanillaSpawnData", nbt);
topNbt.put("multi_sleep", subNbt); //muss den bearbeiteten nbt wieder abgespeichert (nur der boolean wurde ueberschrieben) topNbt.put("multi_sleep", subNbt); //muss den bearbeiteten nbt wieder abgespeichert (nur der boolean wurde ueberschrieben)
castedPlayer.setDataSaver(topNbt); castedPlayer.setDataSaver(topNbt);
return nbt; //gibt den nbt-tag an die aufrufende Methode return nbt; //gibt den nbt-tag an die aufrufende Methode
} else { } else {
return null; return null;
}
} }
} else { } else {
return null; return null;
} }
return null;
} }
public synchronized void setMultiSpawnBlank(ServerPlayerEntity player, int spawn) { //wird aufgerufen wenn das Bett dieses Spielers zerstoert wurde public synchronized void setMultiSpawnBlank(ServerPlayerEntity player, int spawn) { //wird aufgerufen wenn das Bett dieses Spielers zerstoert wurde