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.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; 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.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Optional; @SuppressWarnings("unused") @Mixin(PlayerEntity.class) public class MixinPlayerEntity implements DataHolder { private DimensionType spawnDimension = DimensionType.OVERWORLD; @Inject(at = @At("HEAD"), method = "readCustomDataFromTag") public void readCustomDataFromTag(CompoundTag tag, CallbackInfo info) { spawnDimension = DimensionType.byRawId(tag.getInt("SpawnDimension")); } @Inject(at = @At("HEAD"), method = "writeCustomDataToTag") public void writeCustomDataToTag(CompoundTag tag, CallbackInfo info) { tag.putInt("SpawnDimension", spawnDimension.getRawId()); } @Inject(at = @At("HEAD"), method = "setPlayerSpawn") public void setPlayerSpawn(BlockPos pos, boolean forced, boolean announceChange, CallbackInfo info) { //noinspection ConstantConditions setSpawnDimension(((PlayerEntity) (Object) this).dimension); } @Inject(at = @At("HEAD"), method = "findRespawnPosition", cancellable = true) private static void findRespawnPosition(WorldView world, BlockPos spawnPos, boolean allowNonBed, CallbackInfoReturnable> info) { Block block = world.getBlockState(spawnPos).getBlock(); if (block instanceof CryingObsidianBlock) { info.setReturnValue(ObsidianSpawn.checkPosition(world, spawnPos)); } } @Override public void setSpawnDimension(DimensionType spawnDimension) { this.spawnDimension = spawnDimension; } @Override public DimensionType getSpawnDimension() { return spawnDimension; } }