From a7a1bcd16edf377bac29146de734c66885983438 Mon Sep 17 00:00:00 2001 From: Us3ful-dev Date: Wed, 18 Mar 2026 15:21:52 +0100 Subject: [PATCH 1/3] Working New portal checks fixed x axis portal with obsidian on z axis --- Minecraft.World/PortalTile.cpp | 70 +++++++++++++++++++++++++--------- Minecraft.World/PortalTile.h | 1 + 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp index 5e664e656f..33672e8a90 100644 --- a/Minecraft.World/PortalTile.cpp +++ b/Minecraft.World/PortalTile.cpp @@ -67,25 +67,13 @@ bool PortalTile::isCubeShaped() return false; } -bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn) +bool PortalTile::validPortalFrame(Level* level, int x, int y, int z, int xd, int zd, bool actuallySpawn) { - int xd = 0; - int zd = 0; - if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1; - if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1; - - if (xd == zd) return false; - - if (level->getTile(x - xd, y, z - zd) == 0) - { - x -= xd; - z -= zd; - } - for (int xx = -1; xx <= 2; xx++) { for (int yy = -1; yy <= 3; yy++) { + level->setTileAndData(x, y + 9, z, Tile::glass_Id, 0, Tile::UPDATE_CLIENTS); bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3); if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue; @@ -101,9 +89,7 @@ bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actually } } } - - if( !actuallySpawn ) - return true; + if (!actuallySpawn) return true; for (int xx = 0; xx < 2; xx++) { @@ -112,9 +98,57 @@ bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actually level->setTileAndData(x + xd * xx, y + yy, z + zd * xx, Tile::portalTile_Id, 0, Tile::UPDATE_CLIENTS); } } - + return true; +} + +bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn) +{ + int xd = 0; + int zd = 0; + if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1; + if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1; + + bool twoPosible = false; // two neth portals posible (x and z direction) + if (xd == zd) + { + level->setTileAndData(x, y + 4, z, Tile::emeraldOre_Id, 0, Tile::UPDATE_CLIENTS); + if (xd == 1) twoPosible = true; + else return false; + } + + bool changedx = false; // changed x so it can be reverted if two portals are posible + if (level->getTile(x - xd, y, z) == 0) + { + changedx = true; + x--; + } + else if (level->getTile(x, y, z - zd) == 0 && !twoPosible) + { + level->setTileAndData(x, y + 5, z, Tile::emeraldOre_Id, 0, Tile::UPDATE_CLIENTS); + z--; + } + if (!twoPosible) + { + if (!PortalTile::validPortalFrame(level, x, y, z, xd, zd, actuallySpawn)) return false; + } + else + { + if (!PortalTile::validPortalFrame(level, x, y, z, xd, 0, actuallySpawn)) + { + if (changedx) x++; // revert x (this check wants to check z not x and z) + level->setTileAndData(x, y + 6, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); + + if (level->getTile(x, y, z - zd) == 0) z--; + level->setTileAndData(x, y + 7, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); + + if (!PortalTile::validPortalFrame(level, x, y, z, 0, zd, actuallySpawn)) + return false; + level->setTileAndData(x, y + 8, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); + } + } + return true; } void PortalTile::neighborChanged(Level *level, int x, int y, int z, int type) diff --git a/Minecraft.World/PortalTile.h b/Minecraft.World/PortalTile.h index 7be4320f21..7415efbf25 100644 --- a/Minecraft.World/PortalTile.h +++ b/Minecraft.World/PortalTile.h @@ -13,6 +13,7 @@ class PortalTile : public HalfTransparentTile virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); + virtual bool validPortalFrame(Level* level, int x, int y, int z, int xd, int zd, bool actuallySpawn); virtual bool trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); From 448c91868718b76a1fcfc4e8f43fee2282a25480 Mon Sep 17 00:00:00 2001 From: Us3ful-dev Date: Wed, 18 Mar 2026 17:35:49 +0100 Subject: [PATCH 2/3] Removed Debug code --- Minecraft.World/PortalTile.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp index 33672e8a90..186e6e1734 100644 --- a/Minecraft.World/PortalTile.cpp +++ b/Minecraft.World/PortalTile.cpp @@ -73,7 +73,6 @@ bool PortalTile::validPortalFrame(Level* level, int x, int y, int z, int xd, int { for (int yy = -1; yy <= 3; yy++) { - level->setTileAndData(x, y + 9, z, Tile::glass_Id, 0, Tile::UPDATE_CLIENTS); bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3); if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue; @@ -138,14 +137,11 @@ bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actually if (!PortalTile::validPortalFrame(level, x, y, z, xd, 0, actuallySpawn)) { if (changedx) x++; // revert x (this check wants to check z not x and z) - level->setTileAndData(x, y + 6, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); if (level->getTile(x, y, z - zd) == 0) z--; - level->setTileAndData(x, y + 7, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); if (!PortalTile::validPortalFrame(level, x, y, z, 0, zd, actuallySpawn)) return false; - level->setTileAndData(x, y + 8, z, Tile::diamondOre_Id, 0, Tile::UPDATE_CLIENTS); } } return true; From d3c3770c7e883410c8b0af1fb529d1ca59c0f1b3 Mon Sep 17 00:00:00 2001 From: Us3ful-dev Date: Fri, 20 Mar 2026 13:33:16 +0100 Subject: [PATCH 3/3] Remove unnecessary code removed PortalTile:: from PortalTile::validPortalFrame --- Minecraft.World/PortalTile.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp index 186e6e1734..c7c37085fe 100644 --- a/Minecraft.World/PortalTile.cpp +++ b/Minecraft.World/PortalTile.cpp @@ -130,17 +130,17 @@ bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actually if (!twoPosible) { - if (!PortalTile::validPortalFrame(level, x, y, z, xd, zd, actuallySpawn)) return false; + if (!validPortalFrame(level, x, y, z, xd, zd, actuallySpawn)) return false; } else { - if (!PortalTile::validPortalFrame(level, x, y, z, xd, 0, actuallySpawn)) + if (!validPortalFrame(level, x, y, z, xd, 0, actuallySpawn)) { if (changedx) x++; // revert x (this check wants to check z not x and z) if (level->getTile(x, y, z - zd) == 0) z--; - if (!PortalTile::validPortalFrame(level, x, y, z, 0, zd, actuallySpawn)) + if (!validPortalFrame(level, x, y, z, 0, zd, actuallySpawn)) return false; } }