From 9edfe903109fc9fa7511a37ddd3b68f7817eb82b Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 2 Dec 2020 22:37:38 +0300 Subject: [PATCH] Eternal portal teleport position improvement --- .../ru/betterend/blocks/EndPortalBlock.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index cd894741..90dd5d76 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -13,6 +13,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; +import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; @@ -70,7 +71,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { ServerPlayerEntity player = (ServerPlayerEntity) entity; - player.teleport(destination, exitPos.getX(), exitPos.getY(), exitPos.getZ(), entity.yaw, entity.pitch); + player.teleport(destination, exitPos.getX() + 0.5D, exitPos.getY(), exitPos.getZ() + 0.5D, entity.yaw, entity.pitch); teleEntity.beSetCooldown(player.isCreative() ? 50 : 300); } else { teleEntity.beSetExitPos(exitPos); @@ -102,10 +103,26 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable while(checkPos.getY() < world.getHeight()) { BlockState state = world.getBlockState(checkPos); if(state.isOf(this)) { + int offStep; + checkPos = this.findCenter(world, checkPos, state.get(AXIS)); if (state.get(AXIS).equals(Direction.Axis.X)) { - return checkPos.add(0, 0, 1); + if (entity.getMovementDirection().getAxis() == Direction.Axis.X) { + offStep = entity.getMovementDirection() == Direction.EAST ? -1 : 1; + float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); + entity.yaw = rotation; + } else { + offStep = entity.getMovementDirection() == Direction.NORTH ? 1 : -1; + } + return checkPos.add(0, 0, offStep); } else { - return checkPos.add(1, 0, 0); + if (entity.getMovementDirection().getAxis() == Direction.Axis.Z) { + offStep = entity.getMovementDirection() == Direction.SOUTH ? -1 : 1; + float rotation = entity.applyRotation(BlockRotation.CLOCKWISE_90); + entity.yaw = rotation; + } else { + offStep = entity.getMovementDirection() == Direction.EAST ? 1 : -1; + } + return checkPos.add(offStep, 0, 0); } } checkPos.move(Direction.UP); @@ -116,4 +133,31 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable } return null; } + + private BlockPos.Mutable findCenter(World world, BlockPos.Mutable pos, Direction.Axis axis) { + BlockState right, left; + Direction rightDir, leftDir; + if (axis == Direction.Axis.X) { + right = world.getBlockState(pos.east()); + left = world.getBlockState(pos.west()); + rightDir = Direction.EAST; + leftDir = Direction.WEST; + } else { + right = world.getBlockState(pos.south()); + left = world.getBlockState(pos.north()); + rightDir = Direction.SOUTH; + leftDir = Direction.NORTH; + } + BlockState down = world.getBlockState(pos.down()); + if (down.isOf(this)) { + return findCenter(world, pos.move(Direction.DOWN), axis); + } else if (right.isOf(this) && left.isOf(this)) { + return pos; + } else if (right.isOf(this)) { + return findCenter(world, pos.move(rightDir), axis); + } else if (left.isOf(this)) { + return findCenter(world, pos.move(leftDir), axis); + } + return pos; + } }