36 lines
1.7 KiB
Java
36 lines
1.7 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.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;
|
|
}
|
|
}
|
|
}
|