From c0e116f56a3836f975a45bb2c787e133b5071ce8 Mon Sep 17 00:00:00 2001 From: Vaern Date: Thu, 8 Sep 2022 20:55:28 -0700 Subject: [PATCH] how do you fuck this up that badly thanks mojang --- .../world/worldgen/components/Feature.java | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java index 0d4b568a3..73aaf49bc 100644 --- a/src/main/java/com/hbm/world/worldgen/components/Feature.java +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -50,11 +50,10 @@ abstract public class Feature extends StructureComponent { this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); break; case 2: - //North (2) and East (3) will result in mirrored structures. Not an issue, but keep in mind. this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); break; case 3: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); break; default: this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); @@ -140,15 +139,15 @@ abstract public class Feature extends StructureComponent { switch(metadata) { case 2: return 3; case 3: return 2; - case 4: return 4; - case 5: return 5; + case 4: return 5; + case 5: return 4; } case 3: //East switch(metadata) { case 2: return 4; case 3: return 5; - case 4: return 2; - case 5: return 3; + case 4: return 3; + case 5: return 2; } } return 0; @@ -160,25 +159,42 @@ abstract public class Feature extends StructureComponent { */ protected int getDecoModelMeta(int metadata) { //N: 0b00, S: 0b01, W: 0b10, E: 0b11 - int rot = metadata & 3; switch(this.coordBaseMode) { default: //South break; case 1: //West - break; //N & S can just have NOT used + if((metadata & 3) < 2) //N & S can just have bits toggled + metadata = metadata ^ 3; + else //W & E can just have first bit set to 0 + metadata = metadata ^ 2; + break; case 2: //North + metadata = metadata ^ 1; //N, W, E & S can just have first bit toggled break; case 3: //East + if((metadata & 3) < 2)//N & S can just have second bit set to 1 + metadata = metadata ^ 2; + else //W & E can just have bits toggled + metadata = metadata ^ 3; break; } - return metadata | rot; + return metadata; } + //TODO: fix metadata finder for doors + //TODO: add method for stairs + /* For Later: + * 0/S: S->S; W->W; N->N; E->E + * 1/W: S->W; W->N; N->E; E->S + * 2/N: S->N; W->E; N->S; E->W + * 3/E: S->E; W->S; N->W; E->N + */ + /** * Places door at specified location with orientation-adjusted meta - * don't ask me which directions are what (take direction such as South/0 and add 1) + * 0 = West, 1 = North, 2 = East, 3 = South */ protected void placeDoor(World world, StructureBoundingBox box, Block door, int direction, int featureX, int featureY, int featureZ) { int meta = getMetadataWithOffset(Blocks.wooden_door, direction); @@ -303,6 +319,41 @@ abstract public class Feature extends StructureComponent { } } + /** getXWithOffset & getZWithOffset Methods that are actually fixed **/ + //Turns out, this entire time every single minecraft structure is mirrored instead of rotated when facing East and North + //Also turns out, it's a scarily easy fix that they somehow didn't see *entirely* + @Override + protected int getXWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minX + x; + case 1: + return this.boundingBox.maxX - z; + case 2: + return this.boundingBox.maxX - x; + case 3: + return this.boundingBox.minX + z; + default: + return x; + } + } + + @Override + protected int getZWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minZ + z; + case 1: + return this.boundingBox.minZ + x; + case 2: + return this.boundingBox.maxZ - z; + case 3: + return this.boundingBox.maxZ - x; + default: + return x; + } + } + /** Methods that remove the replaceBlock and alwaysReplace, and other parameters: as they are useless and only serve as a time sink normally. */ protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) {