package com.thebrokenrail.obsidianspawn.mixin; import com.thebrokenrail.obsidianspawn.DataHolder; import com.thebrokenrail.obsidianspawn.ObsidianSpawn; import net.minecraft.block.Block; import net.minecraft.block.CryingObsidianBlock; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.WorldView; import net.minecraft.world.dimension.DimensionType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @SuppressWarnings("unused") @Mixin(ServerPlayNetworkHandler.class) public class MixinServerPlayNetworkHandler { @ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;respawnPlayer(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/world/dimension/DimensionType;Z)Lnet/minecraft/server/network/ServerPlayerEntity;"), method = "onClientStatus", index = 1) public DimensionType adjustRespawnDimension(ServerPlayerEntity player, DimensionType dimension, boolean alive) { if (player.getSpawnPosition() != null) { DimensionType type = ((DataHolder) player).getSpawnDimension(); WorldView world = player.server.getWorld(type); Block block = world.getBlockState(player.getSpawnPosition()).getBlock(); if (!(block instanceof CryingObsidianBlock)) { return DimensionType.OVERWORLD; } else if (!ObsidianSpawn.checkPosition(world, player.getSpawnPosition()).isPresent()) { return DimensionType.OVERWORLD; } else { return type; } } else { return DimensionType.OVERWORLD; } } }