Remove world instance and use directly data from the loaded chunk

This commit is contained in:
Xamora64 2024-09-15 14:37:31 +02:00
parent e3ac0f5e35
commit 1df8778984

View file

@ -1,27 +1,24 @@
package Orebfuscator; package Orebfuscator;
import Orebfuscator.Options.WorldOptions;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.network.play.server.S26PacketMapChunkBulk;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
public class ChunkObfuscator public class ChunkObfuscator
{ {
// èíôîðìàöèÿ î íàëè÷èè ñåêöèè. Ñåêöèè - ýòî áëîêè ðàçìåðîì 16õ16õ16, ñåêöèè ðàñïîëàãàþòñÿ äðóã íàä äðóãîì // ?????????? ? ??????? ??????. ?????? - ??? ????? ???????? 16?16?16, ?????? ????????????? ???? ??? ??????
// Chunk ñîñòîèò èç 16 ñåêöèé, ðàçìåð ÷àíêà 16x16x256 // Chunk ??????? ?? 16 ??????, ?????? ????? 16x16x256
//public boolean[] listLSB = new boolean[16]; //public boolean[] listLSB = new boolean[16];
//public boolean[] listMSB = new boolean[16]; //public boolean[] listMSB = new boolean[16];
// offsetsLSB[] - ñîäåðæèò ñïèñîê ñåêöèé, ñ êîòîðûõ íà÷èíàþòñÿ áëîêè ðàçìåðîì 16x16x16 ñîäåðæàùèå ïåðâûå 8 áèò BlockID // offsetsLSB[] - ???????? ?????? ??????, ? ??????? ?????????? ????? ???????? 16x16x16 ?????????? ?????? 8 ??? BlockID
// ðàçìåð ñåêöèè 16*16*16 = 4096 áàéò // ?????? ?????? 16*16*16 = 4096 ????
public int[] offsetsLSB = new int[16]; public int[] offsetsLSB = new int[16];
// íà÷àëî NibbleArrays ñîäåðæàùèõ ExtendedBlockStorage.blockMetadataArray // ?????? NibbleArrays ?????????? ExtendedBlockStorage.blockMetadataArray
// ðàçìåð ìàññèâà (16*16*16)/2 = 2048 (äåëèì ïîïàëàì, ò.ê. â îäíîì áàéòå ñîäåðæèòñÿ äâà çíà÷åíèÿ ïî 4 áèòà) // ?????? ??????? (16*16*16)/2 = 2048 (????? ???????, ?.?. ? ????? ????? ?????????? ??? ???????? ?? 4 ????)
public int[] offsetsMetadata = new int[16]; public int[] offsetsMetadata = new int[16];
// íà÷àëî NibbleArray ñîäåðæàùåãî ExtendedBlockStorage.blocklightArray // ?????? NibbleArray ??????????? ExtendedBlockStorage.blocklightArray
public int[] offsetsBlocklight = new int[16]; public int[] offsetsBlocklight = new int[16];
// NibbleArray ExtendedBlockStorage.blockMSBArray // NibbleArray ExtendedBlockStorage.blockMSBArray
@ -30,7 +27,7 @@ public class ChunkObfuscator
public int startX; public int startX;
public int startZ; public int startZ;
// Ìàêñèìàëüíûé èíäåêñ+1 ñåêöèè // ???????????? ??????+1 ??????
public int len; public int len;
public byte[] data; public byte[] data;
@ -83,7 +80,7 @@ public class ChunkObfuscator
//if (!world.provider.hasNoSky) //if (!world.provider.hasNoSky)
if (hasSky) if (hasSky)
{ {
// åñëè åñòü íåáî, òî â áóôåðå áóäåò ìàññèâ ExtendedBlockStorage.skylightArray // ???? ???? ????, ?? ? ?????? ????? ?????? ExtendedBlockStorage.skylightArray
pos += countLSB * 2048; pos += countLSB * 2048;
} }
@ -115,7 +112,7 @@ public class ChunkObfuscator
{ {
for (int z = 0; z < 16; z++) for (int z = 0; z < 16; z++)
{ {
if (neetObfuscate(world, x, l | y, z)) if (neetObfuscate(x, l | y, z))
{ {
setBlockID(x, l | y, z, Options.worldOptions.getRandomID()); setBlockID(x, l | y, z, Options.worldOptions.getRandomID());
} }
@ -131,27 +128,32 @@ public class ChunkObfuscator
/** /**
* Returns the block corresponding to the given coordinates inside a chunk. * Returns the block corresponding to the given coordinates inside a chunk.
*/ */
public int getBlockID(World world, int x, int y, int z) public int getBlockID(int x, int y, int z) {
{ int sectionIndex = y >> 4; // Index de la section
int section = y >> 4; if (sectionIndex >= offsetsLSB.length || offsetsLSB[sectionIndex] == -1) {
if (this.offsetsLSB[section] > -1)
{
y = y & 15;
int id = this.data[this.offsetsLSB[section] + (y << 8 | z << 4 | x)] & 255;
if (this.offsetsMSB[section] > -1)
{
int l = y << 4 | z << 4 | x;
int i1 = l >> 1;
int j1 = l & 1;
id |= j1 == 0 ? this.data[this.offsetsMSB[section] + i1] & 15 : this.data[this.offsetsMSB[section] + i1] >> 4 & 15;
}
return id;
}
return 0; return 0;
} }
int yLocal = y & 15;
int xLocal = x & 15;
int zLocal = z & 15;
int blockIndex = (yLocal << 8) | (zLocal << 4) | xLocal;
int lsbIndex = offsetsLSB[sectionIndex] + blockIndex;
int lsb = data[lsbIndex] & 0xFF;
int msb = 0;
if (offsetsMSB[sectionIndex] > -1) {
int msbByteIndex = offsetsMSB[sectionIndex] + (blockIndex >> 1);
int msbByte = data[msbByteIndex] & 0xFF;
if ((blockIndex & 1) == 0) {
msb = msbByte & 0x0F;
} else {
msb = (msbByte >> 4) & 0x0F;
}
}
return (msb << 8) | lsb;
}
public void setBlockID(int x, int y, int z, int blockID) public void setBlockID(int x, int y, int z, int blockID)
{ {
@ -179,36 +181,30 @@ public class ChunkObfuscator
} }
} }
public boolean isTransparent(World world, int x, int y, int z) public boolean isTransparent(int x, int y, int z) {
{ if (x < 0 || x > 15 || y < 0 || y > 255 || z < 0 || z > 15) {
if (y < 0 || y > 255)
return true; return true;
}
if (x < 0 || x > 15 || z < 0 || z > 15) int blockID = getBlockID(x, y, z);
{ return Options.isTransparent(Block.getBlockById(blockID));
return Options.isBlockTransparent(BlockHelper.getBlockID(world, this.startX + x, y, this.startZ + z));
} }
return Options.isBlockTransparent(getBlockID(world, x, y, z)); public boolean neetObfuscate(int x, int y, int z) {
}
public boolean neetObfuscate(World world, int x, int y, int z)
{
if (y > Options.worldOptions.maxObfuscateHeight) if (y > Options.worldOptions.maxObfuscateHeight)
return false; return false;
if (!Options.isObfuscated(getBlockID(world, x, y, z))) int blockID = getBlockID(x, y, z);
{ if (!Options.isObfuscated(blockID)) {
return false; return false;
} }
return !( return !(
isTransparent(world, x - 1, y, z) || isTransparent(x - 1, y, z) ||
isTransparent(world, x + 1, y, z) || isTransparent(x + 1, y, z) ||
isTransparent(world, x, y - 1, z) || isTransparent(x, y - 1, z) ||
isTransparent(world, x, y + 1, z) || isTransparent(x, y + 1, z) ||
isTransparent(world, x, y, z - 1) || isTransparent(x, y, z - 1) ||
isTransparent(world, x, y, z + 1) isTransparent(x, y, z + 1)
); );
} }
} }