From e12ec53c01bc2c0834902feb97d97afe6481992e Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 7 Mar 2021 22:50:25 +0300 Subject: [PATCH] Targeted portals (WIP, bugged) --- src/main/java/ru/betterend/blocks/EndPortalBlock.java | 7 +++---- src/main/java/ru/betterend/rituals/EternalRitual.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index ffd12fdc..f9bcb5a9 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -87,8 +87,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable ServerWorld currentWorld = (ServerWorld) world; MinecraftServer server = currentWorld.getServer(); ServerWorld targetWorld = EndPortals.getWorld(server, state.get(PORTAL)); - boolean isTarget = world.getRegistryKey().equals(targetWorld.getRegistryKey()); - ServerWorld destination = isTarget ? server.getWorld(World.END) : targetWorld; + boolean isInEnd = currentWorld.getRegistryKey().equals(World.END); + ServerWorld destination = isInEnd ? targetWorld : server.getWorld(World.END); BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); if (exitPos == null) return; if (entity instanceof ServerPlayerEntity) { @@ -129,9 +129,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTypeable Identifier currentWorldId = current.getRegistryKey().getValue(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).getCoordinateScale(); - double multiplier = targetMultiplier > currentMultiplier ? currentMultiplier / targetMultiplier : currentMultiplier; + double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; BlockPos.Mutable basePos = pos.mutableCopy().set(pos.getX() * multiplier, pos.getY(), pos.getZ() * multiplier); - System.out.println(basePos); Direction direction = Direction.EAST; BlockPos.Mutable checkPos = basePos.mutableCopy(); for (int step = 1; step < 128; step++) { diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 18cdb6ef..61d06ad6 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -143,7 +143,6 @@ public class EternalRitual { private void activatePortal(Item item) { if (active) return; int state = EndPortals.getPortalState(Registry.ITEM.getId(item)); - System.out.println(state); activatePortal(world, center, state); doEffects((ServerWorld) world, center); if (exit == null) { @@ -217,12 +216,15 @@ public class EternalRitual { public void removePortal(int state) { if (!active || isInvalid()) return; + System.out.println(getTargetWorld(state).getRegistryKey()); + System.out.println(exit); removePortal(getTargetWorld(state), exit); removePortal(world, center); } private void removePortal(World world, BlockPos center) { BlockPos framePos = center.down(); + System.out.println(framePos); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; FRAME_MAP.forEach(point -> { BlockPos pos = framePos.mutableCopy().move(moveDir, point.x).move(Direction.UP, point.y); @@ -258,6 +260,7 @@ public class EternalRitual { double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).getCoordinateScale(); BlockPos.Mutable basePos = center.mutableCopy().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; + int worldCeil = targetWorld.getDimensionHeight() - 1; if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { EternalRitual.generatePortal(targetWorld, basePos, portalAxis); return basePos.toImmutable(); @@ -269,7 +272,8 @@ public class EternalRitual { Chunk chunk = world.getChunk(checkPos); if (chunk != null) { int ceil = chunk.sampleHeightmap(Heightmap.Type.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15) + 1; - if (ceil < 2) continue; + ceil = Math.min(ceil, worldCeil); + if (ceil < 5) continue; checkPos.setY(ceil); while (checkPos.getY() > 2) { if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { @@ -303,6 +307,8 @@ public class EternalRitual { } private boolean checkIsAreaValid(World world, BlockPos pos, Direction.Axis axis) { + System.out.println(pos.getY()); + if (pos.getY() >= world.getDimensionHeight() - 1) return false; if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); }