This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
ObsidianSpawn/src/main/java/com/thebrokenrail/obsidianspawn/mixin/MixinPlayerEntity.java

60 lines
2.3 KiB
Java

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<Optional<Vec3d>> 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;
}
}