Свое измерение. Свои биомы. Свой мир.

5,018
47
783
В общем, сидел я такой гудел, пытался сделать мир. В итоге вроде что то получилось, но вот беда - почему то ни в какую не хочет мой WorldProvider подгружать мой биом. При заходе в мой мир биом\биомы остается\остаются теми же, которые были в ванилле на тот момент когда я покидал мир. Я перепробовал уже все, поудалял все-все что только можно, но выяснить в чем ошибка, даже теперь не могу. Спустя двое суток еб... беготни, я решил все таки написать на форум с этой проблемой.
Я прилагаю полный код всего что наделал, если кто шарит в мирах, взгляните пожалуйста, может быть вы скажете, что не так.
Java:
public class RealismChunkGenerator implements IChunkGenerator
{
    protected static final IBlockState STONE = BlocksList.MAGMATIC_STONE.getDefaultState();
    private final Random rand;
    private NoiseGeneratorOctaves minLimitPerlinNoise;
    private NoiseGeneratorOctaves maxLimitPerlinNoise;
    private NoiseGeneratorOctaves mainPerlinNoise;
    private NoiseGeneratorPerlin surfaceNoise;
    public NoiseGeneratorOctaves scaleNoise;
    public NoiseGeneratorOctaves depthNoise;
    public NoiseGeneratorOctaves forestNoise;
    private final World world;
    private final boolean mapFeaturesEnabled;
    private final WorldType terrainType;
    private final double[] heightMap;
    private final float[] biomeWeights;
    private ChunkGeneratorSettings settings;
    private IBlockState oceanBlock = Blocks.WATER.getDefaultState();
    private double[] depthBuffer = new double[256];
    private Biome[] biomesForGeneration;
    double[] mainNoiseRegion;
    double[] minLimitRegion;
    double[] maxLimitRegion;
    double[] depthRegion;

    public RealismChunkGenerator(World worldIn, long seed, boolean mapFeaturesEnabledIn, String generatorOptions)
    {

        this.world = worldIn;
        this.mapFeaturesEnabled = mapFeaturesEnabledIn;
        this.terrainType = worldIn.getWorldInfo().getTerrainType();
        this.rand = new Random(seed);
        this.minLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.maxLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.mainPerlinNoise = new NoiseGeneratorOctaves(this.rand, 8);
        this.surfaceNoise = new NoiseGeneratorPerlin(this.rand, 4);
        this.scaleNoise = new NoiseGeneratorOctaves(this.rand, 10);
        this.depthNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.forestNoise = new NoiseGeneratorOctaves(this.rand, 8);
        this.heightMap = new double[825];
        this.biomeWeights = new float[25];

        for (int i = -2; i <= 2; ++i)
        {
            for (int j = -2; j <= 2; ++j)
            {
                float f = 10.0F / MathHelper.sqrt((float)(i * i + j * j) + 0.2F);
                this.biomeWeights[i + 2 + (j + 2) * 5] = f;
            }
        }

        if (generatorOptions != null)
        {
            this.settings = ChunkGeneratorSettings.Factory.jsonToFactory(generatorOptions).build();
            this.oceanBlock = this.settings.useLavaOceans ? Blocks.LAVA.getDefaultState() : Blocks.WATER.getDefaultState();
            worldIn.setSeaLevel(this.settings.seaLevel);
        }

        net.minecraftforge.event.terraingen.InitNoiseGensEvent.ContextOverworld ctx =
                new net.minecraftforge.event.terraingen.InitNoiseGensEvent.ContextOverworld(minLimitPerlinNoise, maxLimitPerlinNoise, mainPerlinNoise, surfaceNoise, scaleNoise, depthNoise, forestNoise);
        ctx = net.minecraftforge.event.terraingen.TerrainGen.getModdedNoiseGenerators(worldIn, this.rand, ctx);
        this.minLimitPerlinNoise = ctx.getLPerlin1();
        this.maxLimitPerlinNoise = ctx.getLPerlin2();
        this.mainPerlinNoise = ctx.getPerlin();
        this.surfaceNoise = ctx.getHeight();
        this.scaleNoise = ctx.getScale();
        this.depthNoise = ctx.getDepth();
        this.forestNoise = ctx.getForest();
    }

    public void setBlocksInChunk(int x, int z, ChunkPrimer primer)
    {
        this.biomesForGeneration = this.world.getBiomeProvider().getBiomesForGeneration(this.biomesForGeneration, x * 4 - 2, z * 4 - 2, 10, 10);
     
        this.generateHeightmap(x * 4, 0, z * 4);

        for (int i = 0; i < 4; ++i)
        {
            int j = i * 5;
            int k = (i + 1) * 5;

            for (int l = 0; l < 4; ++l)
            {
                int i1 = (j + l) * 33;
                int j1 = (j + l + 1) * 33;
                int k1 = (k + l) * 33;
                int l1 = (k + l + 1) * 33;

                for (int i2 = 0; i2 < 32; ++i2)
                {
                    double d0 = 0.125D;
                    double d1 = this.heightMap[i1 + i2];
                    double d2 = this.heightMap[j1 + i2];
                    double d3 = this.heightMap[k1 + i2];
                    double d4 = this.heightMap[l1 + i2];
                    double d5 = (this.heightMap[i1 + i2 + 1] - d1) * 0.125D;
                    double d6 = (this.heightMap[j1 + i2 + 1] - d2) * 0.125D;
                    double d7 = (this.heightMap[k1 + i2 + 1] - d3) * 0.125D;
                    double d8 = (this.heightMap[l1 + i2 + 1] - d4) * 0.125D;

                    for (int j2 = 0; j2 < 8; ++j2)
                    {
                        double d9 = 0.25D;
                        double d10 = d1;
                        double d11 = d2;
                        double d12 = (d3 - d1) * 0.25D;
                        double d13 = (d4 - d2) * 0.25D;

                        for (int k2 = 0; k2 < 4; ++k2)
                        {
                            double d14 = 0.25D;
                            double d16 = (d11 - d10) * 0.25D;
                            double lvt_45_1_ = d10 - d16;

                            for (int l2 = 0; l2 < 4; ++l2)
                            {
                                if ((lvt_45_1_ += d16) > 0.0D)
                                {
                                    primer.setBlockState(i * 4 + k2, i2 * 8 + j2, l * 4 + l2, STONE);
                                }
                                else if (i2 * 8 + j2 < this.settings.seaLevel)
                                {
                                    primer.setBlockState(i * 4 + k2, i2 * 8 + j2, l * 4 + l2, this.oceanBlock);
                                }
                            }

                            d10 += d12;
                            d11 += d13;
                        }

                        d1 += d5;
                        d2 += d6;
                        d3 += d7;
                        d4 += d8;
                    }
                }
            }
        }
    }

    public void replaceBiomeBlocks(int x, int z, ChunkPrimer primer, Biome[] biomesIn)
    {
        if (!net.minecraftforge.event.ForgeEventFactory.onReplaceBiomeBlocks(this, x, z, primer, this.world)) return;
        double d0 = 0.03125D;
        this.depthBuffer = this.surfaceNoise.getRegion(this.depthBuffer, (double)(x * 16), (double)(z * 16), 16, 16, 0.0625D, 0.0625D, 1.0D);

        for (int i = 0; i < 16; ++i)
        {
            for (int j = 0; j < 16; ++j)
            {
                Biome biome = biomesIn[j + i * 16];
                biome.genTerrainBlocks(this.world, this.rand, primer, x * 16 + i, z * 16 + j, this.depthBuffer[j + i * 16]);
            }
        }
    }

    public Chunk generateChunk(int x, int z)
    {
        this.rand.setSeed((long)x * 341873128712L + (long)z * 132897987541L);
        ChunkPrimer chunkprimer = new ChunkPrimer();
        this.setBlocksInChunk(x, z, chunkprimer);
       this.biomesForGeneration = this.world.getBiomeProvider().getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16);
       
        this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration);

        Chunk chunk = new Chunk(this.world, chunkprimer, x, z);
        byte[] abyte = chunk.getBiomeArray();

        for (int i = 0; i < abyte.length; ++i)
        {
            abyte[i] = (byte)Biome.getIdForBiome(this.biomesForGeneration[i]);
        }

        chunk.generateSkylightMap();
        return chunk;
    }

    private void generateHeightmap(int p_185978_1_, int p_185978_2_, int p_185978_3_)
    {
        this.depthRegion = this.depthNoise.generateNoiseOctaves(this.depthRegion, p_185978_1_, p_185978_3_, 5, 5, (double)this.settings.depthNoiseScaleX, (double)this.settings.depthNoiseScaleZ, (double)this.settings.depthNoiseScaleExponent);
        float f = this.settings.coordinateScale;
        float f1 = this.settings.heightScale;
        this.mainNoiseRegion = this.mainPerlinNoise.generateNoiseOctaves(this.mainNoiseRegion, p_185978_1_, p_185978_2_, p_185978_3_, 5, 33, 5, (double)(f / this.settings.mainNoiseScaleX), (double)(f1 / this.settings.mainNoiseScaleY), (double)(f / this.settings.mainNoiseScaleZ));
        this.minLimitRegion = this.minLimitPerlinNoise.generateNoiseOctaves(this.minLimitRegion, p_185978_1_, p_185978_2_, p_185978_3_, 5, 33, 5, (double)f, (double)f1, (double)f);
        this.maxLimitRegion = this.maxLimitPerlinNoise.generateNoiseOctaves(this.maxLimitRegion, p_185978_1_, p_185978_2_, p_185978_3_, 5, 33, 5, (double)f, (double)f1, (double)f);
        int i = 0;
        int j = 0;

        for (int k = 0; k < 5; ++k)
        {
            for (int l = 0; l < 5; ++l)
            {
                float f2 = 0.0F;
                float f3 = 0.0F;
                float f4 = 0.0F;
                int i1 = 2;
                Biome biome = this.biomesForGeneration[k + 2 + (l + 2) * 10];

                for (int j1 = -2; j1 <= 2; ++j1)
                {
                    for (int k1 = -2; k1 <= 2; ++k1)
                    {
                        Biome biome1 = this.biomesForGeneration[k + j1 + 2 + (l + k1 + 2) * 10];
                        float f5 = this.settings.biomeDepthOffSet + biome1.getBaseHeight() * this.settings.biomeDepthWeight;
                        float f6 = this.settings.biomeScaleOffset + biome1.getHeightVariation() * this.settings.biomeScaleWeight;

                        if (this.terrainType == WorldType.AMPLIFIED && f5 > 0.0F)
                        {
                            f5 = 1.0F + f5 * 2.0F;
                            f6 = 1.0F + f6 * 4.0F;
                        }

                        float f7 = this.biomeWeights[j1 + 2 + (k1 + 2) * 5] / (f5 + 2.0F);

                        if (biome1.getBaseHeight() > biome.getBaseHeight())
                        {
                            f7 /= 2.0F;
                        }

                        f2 += f6 * f7;
                        f3 += f5 * f7;
                        f4 += f7;
                    }
                }

                f2 = f2 / f4;
                f3 = f3 / f4;
                f2 = f2 * 0.9F + 0.1F;
                f3 = (f3 * 4.0F - 1.0F) / 8.0F;
                double d7 = this.depthRegion[j] / 8000.0D;

                if (d7 < 0.0D)
                {
                    d7 = -d7 * 0.3D;
                }

                d7 = d7 * 3.0D - 2.0D;

                if (d7 < 0.0D)
                {
                    d7 = d7 / 2.0D;

                    if (d7 < -1.0D)
                    {
                        d7 = -1.0D;
                    }

                    d7 = d7 / 1.4D;
                    d7 = d7 / 2.0D;
                }
                else
                {
                    if (d7 > 1.0D)
                    {
                        d7 = 1.0D;
                    }

                    d7 = d7 / 8.0D;
                }

                ++j;
                double d8 = (double)f3;
                double d9 = (double)f2;
                d8 = d8 + d7 * 0.2D;
                d8 = d8 * (double)this.settings.baseSize / 8.0D;
                double d0 = (double)this.settings.baseSize + d8 * 4.0D;

                for (int l1 = 0; l1 < 33; ++l1)
                {
                    double d1 = ((double)l1 - d0) * (double)this.settings.stretchY * 128.0D / 256.0D / d9;

                    if (d1 < 0.0D)
                    {
                        d1 *= 4.0D;
                    }

                    double d2 = this.minLimitRegion[i] / (double)this.settings.lowerLimitScale;
                    double d3 = this.maxLimitRegion[i] / (double)this.settings.upperLimitScale;
                    double d4 = (this.mainNoiseRegion[i] / 10.0D + 1.0D) / 2.0D;
                    double d5 = MathHelper.clampedLerp(d2, d3, d4) - d1;

                    if (l1 > 29)
                    {
                        double d6 = (double)((float)(l1 - 29) / 3.0F);
                        d5 = d5 * (1.0D - d6) + -10.0D * d6;
                    }

                    this.heightMap[i] = d5;
                    ++i;
                }
            }
        }
    }

    @Override
    public void populate(int x, int z) {
        // TODO Auto-generated method stub
       
    }

    @Override
    public boolean generateStructures(Chunk chunkIn, int x, int z) {
       
        return false;
    }

    @Override
    public List<SpawnListEntry> getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public BlockPos getNearestStructurePos(World worldIn, String structureName, BlockPos position,
            boolean findUnexplored) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void recreateStructures(Chunk chunkIn, int x, int z) {
        // TODO Auto-generated method stub
       
    }

    @Override
    public boolean isInsideStructure(World worldIn, String structureName, BlockPos pos) {
        // TODO Auto-generated method stub
        return false;
    }

 
}
Java:
public class RegBiomes {

    public static final Biome MAGMATIC_BIOME = new MagmaticBiome();
//    public static final Biome SEDIMENTARY_BIOME = new SedimentaryBiome();
//    public static final Biome METAMORPHIC_BIOME = new MetamorhicBiome();
   
   
    public static void registerBiomes() {
        register(MAGMATIC_BIOME, "magmatic_biome", BiomeType.WARM, Type.HILLS);
   
    }
   
    public static Biome register(Biome b, String name, BiomeType bt, Type... types) {
        b.setRegistryName(name);
        ForgeRegistries.BIOMES.register(b);
   
        BiomeDictionary.addTypes(b, types);
        BiomeManager.addBiome(bt, new BiomeEntry(b, 10));
        BiomeManager.addSpawnBiome(b);
        return b;
    }
}
public class RealismWorld extends WorldProviderSurface {

public RealismWorld() {
super();
this.biomeProvider = new RealismBiomeProvider();

}

@Override
public DimensionType getDimensionType() {
return RegWorlds.REALISM_WORLD;
}

@Override
public IChunkGenerator createChunkGenerator() {
return new RealismChunkGenerator(world, world.rand.nextLong(), false, "magmatic_biome");
}

@Override
public boolean canRespawnHere() {
return true;
}


@Override
public boolean isSurfaceWorld() {
return true;
}
}
Ну и биомпровайдер еще есть, но не считая того что ванильные биомы там заменены на один мой пока, он ничем от ванильного не отличается.
Java:
public class RealismBiomeProvider extends BiomeProvider
{
    private ChunkGeneratorSettings settings;
    private GenLayer genBiomes;
    /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
    private GenLayer biomeIndexLayer;
    /** The biome list. */
    private final BiomeCache biomeCache;
    /** A list of biomes that the player can spawn in. */
    private final List<Biome> biomesToSpawnIn;
    public static List<Biome> allowedBiomes = Lists.newArrayList(RegBiomes.MAGMATIC_BIOME);

    public RealismBiomeProvider()
    {
        this.biomeCache = new BiomeCache(this);
        this.biomesToSpawnIn = Lists.newArrayList(allowedBiomes);
    }

    private RealismBiomeProvider(long seed, WorldType worldType, ChunkGeneratorSettings options) {
        this();
        GenLayer[] agenlayer = GenLayer.initializeAllBiomeGenerators(seed, worldType, options);
        //agenlayer = getModdedBiomeGenerators(worldTypeIn, seed, agenlayer);
        this.genBiomes = agenlayer[0];
        this.biomeIndexLayer = agenlayer[1];
    }

    public RealismBiomeProvider(WorldInfo info)
    {
        this();
    }

    /**
     * Gets the list of valid biomes for the player to spawn in.
     */
    public List<Biome> getBiomesToSpawnIn()
    {
        return this.biomesToSpawnIn;
    }

    /**
     * Returns the biome generator
     */
    public Biome getBiome(BlockPos pos)
    {
        return this.getBiome(pos, (Biome)null);
    }

    public Biome getBiome(BlockPos pos, Biome defaultBiome)
    {
        return this.biomeCache.getBiome(pos.getX(), pos.getZ(), defaultBiome);
    }

    /**
     * Return an adjusted version of a given temperature based on the y height
     */
    public float getTemperatureAtHeight(float p_76939_1_, int p_76939_2_)
    {
        return p_76939_1_;
    }

    /**
     * Returns an array of biomes for the location input.
     */
    public Biome[] getBiomesForGeneration(Biome[] biomes, int x, int z, int width, int height)
    {
        IntCache.resetIntCache();

        if (biomes == null || biomes.length < width * height)
        {
            biomes = new Biome[width * height];
        }

        int[] aint = this.genBiomes.getInts(x, z, width, height);

        try
        {
            for (int i = 0; i < width * height; ++i)
            {
                biomes[i] = Biome.getBiome(aint[i], Biomes.DEFAULT);
            }

            return biomes;
        }
        catch (Throwable throwable)
        {
            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
            CrashReportCategory crashreportcategory = crashreport.makeCategory("RawBiomeBlock");
            crashreportcategory.addCrashSection("biomes[] size", Integer.valueOf(biomes.length));
            crashreportcategory.addCrashSection("x", Integer.valueOf(x));
            crashreportcategory.addCrashSection("z", Integer.valueOf(z));
            crashreportcategory.addCrashSection("w", Integer.valueOf(width));
            crashreportcategory.addCrashSection("h", Integer.valueOf(height));
            throw new ReportedException(crashreport);
        }
    }

    /**
     * Gets biomes to use for the blocks and loads the other data like temperature and humidity onto the
     * WorldChunkManager.
     */
    public Biome[] getBiomes(@Nullable Biome[] oldBiomeList, int x, int z, int width, int depth)
    {
        return this.getBiomes(oldBiomeList, x, z, width, depth, true);
    }

    /**
     * Gets a list of biomes for the specified blocks.
     */
    public Biome[] getBiomes(@Nullable Biome[] listToReuse, int x, int z, int width, int length, boolean cacheFlag)
    {
        IntCache.resetIntCache();

        if (listToReuse == null || listToReuse.length < width * length)
        {
            listToReuse = new Biome[width * length];
        }

        if (cacheFlag && width == 16 && length == 16 && (x & 15) == 0 && (z & 15) == 0)
        {
            Biome[] abiome = this.biomeCache.getCachedBiomes(x, z);
            System.arraycopy(abiome, 0, listToReuse, 0, width * length);
            return listToReuse;
        }
        else
        {
            int[] aint = this.biomeIndexLayer.getInts(x, z, width, length);

            for (int i = 0; i < width * length; ++i)
            {
                listToReuse[i] = Biome.getBiome(aint[i], Biomes.DEFAULT);
            }

            return listToReuse;
        }
    }

    /**
     * checks given Chunk's Biomes against List of allowed ones
     */
    public boolean areBiomesViable(int x, int z, int radius, List<Biome> allowed)
    {
        IntCache.resetIntCache();
        int i = x - radius >> 2;
        int j = z - radius >> 2;
        int k = x + radius >> 2;
        int l = z + radius >> 2;
        int i1 = k - i + 1;
        int j1 = l - j + 1;
        int[] aint = this.genBiomes.getInts(i, j, i1, j1);

        try
        {
            for (int k1 = 0; k1 < i1 * j1; ++k1)
            {
                Biome biome = Biome.getBiome(aint[k1]);

                if (!allowed.contains(biome))
                {
                    return false;
                }
            }

            return true;
        }
        catch (Throwable throwable)
        {
            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
            CrashReportCategory crashreportcategory = crashreport.makeCategory("Layer");
            crashreportcategory.addCrashSection("Layer", this.genBiomes.toString());
            crashreportcategory.addCrashSection("x", Integer.valueOf(x));
            crashreportcategory.addCrashSection("z", Integer.valueOf(z));
            crashreportcategory.addCrashSection("radius", Integer.valueOf(radius));
            crashreportcategory.addCrashSection("allowed", allowed);
            throw new ReportedException(crashreport);
        }
    }

    @Nullable
    public BlockPos findBiomePosition(int x, int z, int range, List<Biome> biomes, Random random)
    {
        IntCache.resetIntCache();
        int i = x - range >> 2;
        int j = z - range >> 2;
        int k = x + range >> 2;
        int l = z + range >> 2;
        int i1 = k - i + 1;
        int j1 = l - j + 1;
        int[] aint = this.genBiomes.getInts(i, j, i1, j1);
        BlockPos blockpos = null;
        int k1 = 0;

        for (int l1 = 0; l1 < i1 * j1; ++l1)
        {
            int i2 = i + l1 % i1 << 2;
            int j2 = j + l1 / i1 << 2;
            Biome biome = Biome.getBiome(aint[l1]);

            if (biomes.contains(biome) && (blockpos == null || random.nextInt(k1 + 1) == 0))
            {
                blockpos = new BlockPos(i2, 0, j2);
                ++k1;
            }
        }

        return blockpos;
    }

    /**
     * Calls the WorldChunkManager's biomeCache.cleanupCache()
     */
    public void cleanupCache()
    {
        this.biomeCache.cleanupCache();
    }

    public GenLayer[] getModdedBiomeGenerators(WorldType worldType, long seed, GenLayer[] original)
    {
        net.minecraftforge.event.terraingen.WorldTypeEvent.InitBiomeGens event = new net.minecraftforge.event.terraingen.WorldTypeEvent.InitBiomeGens(worldType, seed, original);
        net.minecraftforge.common.MinecraftForge.TERRAIN_GEN_BUS.post(event);
        return event.getNewBiomeGens();
    }

    public boolean isFixedBiome()
    {
        return this.settings != null && this.settings.fixedBiome >= 0;
    }

    public Biome getFixedBiome()
    {
        return this.settings != null && this.settings.fixedBiome >= 0 ? Biome.getBiomeForId(this.settings.fixedBiome) : null;
    }
}
 
Последнее редактирование:
102
3
77
С размерами я разобрался там зум просто надо было накинуть..
У меня что то сломалось в реплейсе. Настолько сломалось что даже в ванилле перестало работать:)
Просто я писал сообщение примерно 2 часа, поэтому не заметил про слои.
Не знаю о каком "реплейсе" ты говоришь, используй более понятные термины, иначе ты лишаешь себя части аудитории, которая могла бы тебе помочь (например я).

Вообще тебе намного проще будет выкинуть какашку, которую ты намесил и взять тот код, что я скинул.
 
5,018
47
783
Вообще тебе намного проще будет выкинуть какашку, которую ты намесил
У меня все тоже самое что у тебя, генератор такой же и так далее. Мне интересно разобраться в этом самому.
P.S Я имел ввиду метод Biome#genTerrainBlocks который вызывается в replaceBiomeBlocks в чанк генераторе и так далее до generateChunk

Сделать мир аналогичный ванильному не моя цель ведь.
Мне ведь в дальнейшем нужно будет очень сильно видоизменить этот мир. И если я у тебя скопипащу, я так и не разберусь как же это все таки все работает, и придется разбираться потом... оно мне надо?)
 
102
3
77
У меня все тоже самое что у тебя, генератор такой же и так далее. Мне интересно разобраться в этом самому.
P.S Я имел ввиду метод Biome#genTerrainBlocks который вызывается в replaceBiomeBlocks в чанк генераторе и так далее до generateChunk

Сделать мир аналогичный ванильному не моя цель ведь.
Мне ведь в дальнейшем нужно будет очень сильно видоизменить этот мир. И если я у тебя скопипащу, я так и не разберусь как же это все таки все работает, и придется разбираться потом... оно мне надо?)
Легче разбираться в рабочем коде, чем в нерабочем.

Тема давно вышла за рамки вопроса. Зачем тебе Biome.genTerrainBlocks? Тебе нужна земля и трава? Они и так генерируются. Если хочешь их изменить, то добавь в конструктор BiomeTest код:
Java:
this.fillerBlock = <BLOCK>;
this.topBlock = <BLOCK>;
Если нужно изменить алгоритм - переопредели метод Biome.genTerrainBlocks(...) в BiomeTest. Ванильная генерация не может сломаться, если ты ошибся в методе, который не используется для генерации ванильного мира.
 
5,018
47
783
Я вот тоже не понимаю как так, но не шучу, вот смотри сам:
Более того, в ванилле появились мои биомыo_O
1548879234398.pngВ проблемах ванильки был виноват вот эта строка:
// if (!net.minecraftforge.event.ForgeEventFactory.onReplaceBiomeBlocks(this, x, z, primer, this.world)) return;
Убрав ее... в ванилле начали генерироваться мои блоки вместо земли и травы. Но у меня их так и не появилось
Java:
package com.legendgamer.realism.world.chunks;

import java.util.Arrays;
import java.util.List;
import java.util.Random;

import com.legendgamer.realism.reg.BlocksList;
import com.legendgamer.realism.reg.RegBiomes;
import com.legendgamer.realism.world.biomes.provider.RealismBiomeProvider;

import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.init.Biomes;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.BlockPos.MutableBlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biome.SpawnListEntry;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkPrimer;
import net.minecraft.world.gen.ChunkGeneratorSettings;
import net.minecraft.world.gen.IChunkGenerator;
import net.minecraft.world.gen.NoiseGeneratorOctaves;
import net.minecraft.world.gen.NoiseGeneratorPerlin;

public class RealismChunkGenerator implements IChunkGenerator
{
    protected static IBlockState MSTONE;
    private final Random rand;
    private NoiseGeneratorOctaves minLimitPerlinNoise;
    private NoiseGeneratorOctaves maxLimitPerlinNoise;
    private NoiseGeneratorOctaves mainPerlinNoise;
    private NoiseGeneratorPerlin surfaceNoise;
    public NoiseGeneratorOctaves scaleNoise;
    public NoiseGeneratorOctaves depthNoise;
    public NoiseGeneratorOctaves forestNoise;
    private final World world;
    private final boolean mapFeaturesEnabled;
    private final WorldType terrainType;
    private final double[] heightMap;
    private final float[] biomeWeights;

    private IBlockState oceanBlock = Blocks.WATER.getDefaultState();
    private double[] depthBuffer = new double[256];
    private Biome[] biomesForGeneration;
    double[] mainNoiseRegion;
    double[] minLimitRegion;
    double[] maxLimitRegion;
    double[] depthRegion;
    public  float biomeDepthWeight;
    public  float biomeDepthOffSet;
    public  float biomeScaleWeight;
    public  float biomeScaleOffset;
    private float coordinateScale = 684.412F;
    private float heightScale = 684.412F;
    private float baseSize = 9.5F;
    private float stretchY = 12.0F;
    public int seaLevel;
    private float upperLimitScale = 512.0F;
    private float lowerLimitScale = 512.0F;
    private float mainNoiseScaleX = 80.0F;
    private float mainNoiseScaleY = 160.0F;
    private float mainNoiseScaleZ = 80.0F;

    private double depthNoiseScaleX = 200.0D;
    private double depthNoiseScaleZ = 200.0D;
    private double depthNoiseScaleExponent = 0.5D;

    public RealismChunkGenerator(World worldIn, long seed, boolean mapFeaturesEnabledIn)
    {

        this.world = worldIn;
        this.mapFeaturesEnabled = true;
        this.MSTONE = this.getStoneBlock();
        this.terrainType = worldIn.getWorldInfo().getTerrainType();
        this.rand = new Random(seed);
        this.minLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.maxLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.mainPerlinNoise = new NoiseGeneratorOctaves(this.rand, 8);
        this.surfaceNoise = new NoiseGeneratorPerlin(this.rand, 4);
        this.scaleNoise = new NoiseGeneratorOctaves(this.rand, 10);
        this.depthNoise = new NoiseGeneratorOctaves(this.rand, 16);
        this.forestNoise = new NoiseGeneratorOctaves(this.rand, 8);
        this.heightMap = new double[825];
        this.biomeWeights = new float[25];

        for (int i = -2; i <= 2; ++i)
        {
            for (int j = -2; j <= 2; ++j)
            {
                float f = 10.0F / MathHelper.sqrt((float)(i * i + j * j) + 0.2F);
                this.biomeWeights[i + 2 + (j + 2) * 5] = f;
            }
        }


        net.minecraftforge.event.terraingen.InitNoiseGensEvent.ContextOverworld ctx =
                new net.minecraftforge.event.terraingen.InitNoiseGensEvent.ContextOverworld(minLimitPerlinNoise, maxLimitPerlinNoise, mainPerlinNoise, surfaceNoise, scaleNoise, depthNoise, forestNoise);
        ctx = net.minecraftforge.event.terraingen.TerrainGen.getModdedNoiseGenerators(worldIn, this.rand, ctx);
        this.minLimitPerlinNoise = ctx.getLPerlin1();
        this.maxLimitPerlinNoise = ctx.getLPerlin2();
        this.mainPerlinNoise = ctx.getPerlin();
        this.surfaceNoise = ctx.getHeight();
        this.scaleNoise = ctx.getScale();
        this.depthNoise = ctx.getDepth();
        this.forestNoise = ctx.getForest();
  
    }

    public static  IBlockState getStoneBlock() {
        return MSTONE;
    }
    public static  void setStoneBlock(IBlockState block) {
        MSTONE = block;
    
    }
    public void setBlocksInChunk(int x, int z, ChunkPrimer primer)
    {
    
         this.biomesForGeneration = this.world.getBiomeProvider().getBiomesForGeneration(this.biomesForGeneration, x * 16, z * 16, 16, 16);
  
        this.generateHeightmap(x *4 , 0, z *4);

        for (int i = 0; i < 4; ++i)
        {
            int j = i * 5;
            int k = (i + 1) * 5;

            for (int l = 0; l < 4; ++l)
            {
                int i1 = (j + l) * 33;
                int j1 = (j + l + 1) * 33;
                int k1 = (k + l) * 33;
                int l1 = (k + l + 1) * 33;

                for (int i2 = 0; i2 < 32; ++i2)
                {
                    double d0 = 0.125D;
                    double d1 = this.heightMap[i1 + i2];
                    double d2 = this.heightMap[j1 + i2];
                    double d3 = this.heightMap[k1 + i2];
                    double d4 = this.heightMap[l1 + i2];
                    double d5 = (this.heightMap[i1 + i2 + 1] - d1) * 0.125D;
                    double d6 = (this.heightMap[j1 + i2 + 1] - d2) * 0.125D;
                    double d7 = (this.heightMap[k1 + i2 + 1] - d3) * 0.125D;
                    double d8 = (this.heightMap[l1 + i2 + 1] - d4) * 0.125D;

                    for (int j2 = 0; j2 < 8; ++j2)
                    {
                        double d9 = 0.25D;
                        double d10 = d1;
                        double d11 = d2;
                        double d12 = (d3 - d1) * 0.25D;
                        double d13 = (d4 - d2) * 0.25D;

                        for (int k2 = 0; k2 < 4; ++k2)
                        {
                            double d14 = 0.25D;
                            double d16 = (d11 - d10) * 0.25D;
                            double lvt_45_1_ = d10 - d16;

                            for (int l2 = 0; l2 < 4; ++l2)
                            {
                                if ((lvt_45_1_ += d16) > 0.0D)
                                {
                                    primer.setBlockState(i * 4 + k2, i2 * 8 + j2, l * 4 + l2, MSTONE);
                                }
                                else if (i2 * 8 + j2 < this.seaLevel)
                                {
                                    primer.setBlockState(i * 4 + k2, i2 * 8 + j2, l * 4 + l2, this.oceanBlock);
                                }
                            }

                            d10 += d12;
                            d11 += d13;
                        }

                        d1 += d5;
                        d2 += d6;
                        d3 += d7;
                        d4 += d8;
                    }
                }
            }
        }
    }

    public void replaceBiomeBlocks(int x, int z, ChunkPrimer primer, Biome[] biomesIn)
    {
      //  if (!net.minecraftforge.event.ForgeEventFactory.onReplaceBiomeBlocks(this, x, z, primer, this.world)) return;
        double d0 = 0.03125D;
        this.depthBuffer = this.surfaceNoise.getRegion(this.depthBuffer, (double)(x * 16), (double)(z * 16), 16, 16, 0.0625D, 0.0625D, 1.0D);

        for (int i = 0; i < 16; ++i)
        {
            for (int j = 0; j < 16; ++j)
            {
                Biome biome = biomesIn[j + i * 16];
                biome.genTerrainBlocks(this.world, this.rand, primer, x * 16 + i, z * 16 + j, this.depthBuffer[j + i * 16]);
            }
        }
    }


    public Chunk generateChunk(int x, int z)
    {
        this.rand.setSeed((long)x * 341873128712L + (long)z * 132897987541L);
        ChunkPrimer chunkprimer = new ChunkPrimer();
        this.setBlocksInChunk(x, z, chunkprimer);

    
        this.biomesForGeneration = this.world.getBiomeProvider().getBiomesForGeneration(this.biomesForGeneration, x * 16, z * 16, 16, 16);
    
        this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration);


  
       Chunk chunk = new Chunk(this.world, chunkprimer, x, z);
       byte[] abyte = chunk.getBiomeArray();

       for (int i = 0; i < abyte.length; ++i)
       {
           abyte[i] = (byte)Biome.getIdForBiome(this.biomesForGeneration[i]);
       }
       chunk.generateSkylightMap();

        return chunk;
    }

    public void generateHeightmap(int x, int y, int z)
    {

        this.depthRegion = this.depthNoise.generateNoiseOctaves(this.depthRegion, x, z, 5, 5, (double)this.depthNoiseScaleX, (double)this.depthNoiseScaleZ, (double)this.depthNoiseScaleExponent);
  
        float f = this.coordinateScale;
        float f1 = this.heightScale;
        this.mainNoiseRegion = this.mainPerlinNoise.generateNoiseOctaves(this.mainNoiseRegion, x, y, z, 5, 33, 5, (double)(f / this.mainNoiseScaleX), (double)(f1 / this.mainNoiseScaleY), (double)(f / this.mainNoiseScaleZ));
        this.minLimitRegion = this.minLimitPerlinNoise.generateNoiseOctaves(this.minLimitRegion, x, y, z, 5, 33, 5, (double)f, (double)f1, (double)f);
        this.maxLimitRegion = this.maxLimitPerlinNoise.generateNoiseOctaves(this.maxLimitRegion, x, y, z, 5, 33, 5, (double)f, (double)f1, (double)f);
        int i = 0;
        int j = 0;

        for (int k = 0; k < 5; ++k)
        {
            for (int l = 0; l < 5; ++l)
            {
                float f2 = 0.0F;
                float f3 = 0.0F;
                float f4 = 0.0F;
                int i1 = 2;
                Biome biome = this.biomesForGeneration[k + 2 + (l + 2) * 10];
          
                for (int j1 = -2; j1 <= 2; ++j1)
                {
                    for (int k1 = -2; k1 <= 2; ++k1)
                    {
                        Biome biome1 = this.biomesForGeneration[k + j1 + 2 + (l + k1 + 2) * 10];
                        float f5 = this.biomeDepthOffSet + biome1.getBaseHeight() * this.biomeDepthWeight;
                        float f6 = this.biomeScaleOffset + biome1.getHeightVariation() * this.biomeScaleWeight;

    
                        float f7 = this.biomeWeights[j1 + 2 + (k1 + 2) * 5] / (f5 + 2.0F);

                        if (biome1.getBaseHeight() > biome.getBaseHeight())
                        {
                            f7 /= 2.0F;
                        }

                        f2 += f6 * f7;
                        f3 += f5 * f7;
                        f4 += f7;
                    }
                }

                f2 = f2 / f4;
                f3 = f3 / f4;
                f2 = f2 * 0.9F + 0.1F;
                f3 = (f3 * 4.0F - 1.0F) / 8.0F;
                double d7 = this.depthRegion[j] / 8000.0D;

                if (d7 < 0.0D)
                {
                    d7 = -d7 * 0.3D;
                }

                d7 = d7 * 3.0D - 2.0D;

                if (d7 < 0.0D)
                {
                    d7 = d7 / 2.0D;

                    if (d7 < -1.0D)
                    {
                        d7 = -1.0D;
                    }

                    d7 = d7 / 1.4D;
                    d7 = d7 / 2.0D;
                }
                else
                {
                    if (d7 > 1.0D)
                    {
                        d7 = 1.0D;
                    }

                    d7 = d7 / 8.0D;
                }

                ++j;
                double d8 = (double)f3;
                double d9 = (double)f2;
                d8 = d8 + d7 * 0.2D;
                d8 = d8 * (double)this.baseSize / 8.0D;
                double d0 = (double)this.baseSize + d8 * 4.0D;

                for (int l1 = 0; l1 < 33; ++l1)
                {
                    //переменная отвечающая за высоту гор
                    double d1 = ((double)l1 - d0) * (double)this.stretchY * 128.0D / 402.0D / d9;

                    if (d1 < 0.0D)
                    {
                        d1 *= 4.0D;
                    }

                    double d2 = this.minLimitRegion[i] / (double)this.lowerLimitScale;
                    double d3 = this.maxLimitRegion[i] / (double)this.upperLimitScale;
                    double d4 = (this.mainNoiseRegion[i] / 10.0D + 1.0D) / 2.0D;
                    double d5 = MathHelper.clampedLerp(d2, d3, d4) - d1;

                    if (l1 > 29)
                    {
                        double d6 = (double)((float)(l1 - 29) / 3.0F);
                        d5 = d5 * (1.0D - d6) + -10.0D * d6;
                    }

                    this.heightMap[i] = d5;
                    ++i;
                }
            }
        }
    }

    @Override
    public void populate(int x, int z) {
        // TODO Auto-generated method stub
    
    }

    @Override
    public boolean generateStructures(Chunk chunkIn, int x, int z) {
    
        return false;
    }

    @Override
    public List<SpawnListEntry> getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public BlockPos getNearestStructurePos(World worldIn, String structureName, BlockPos position,
            boolean findUnexplored) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void recreateStructures(Chunk chunkIn, int x, int z) {
        // TODO Auto-generated method stub
    
    }

    @Override
    public boolean isInsideStructure(World worldIn, String structureName, BlockPos pos) {
        // TODO Auto-generated method stub
        return false;
    }


}
Они и так генерируются.
Нету их, нету...
Все файлы которые ты мне скинул у меня есть и они такие же как у тебя. А вот то что у тебя не сделан чанкгенератор это жаль. Я то свой делаю.
 
Последнее редактирование:
102
3
77
Более того, в ванилле появились мои биомы
Потому что я только что открыл твой RegBiomes и увидел там вот это:
Java:
BiomeManager.addBiome(bt, new BiomeEntry(b, 10));
Дальше объяснять не нужно? Твои биомы и до этого в ваниле были, просто ты их не встречал. Либо, если ты уже это исправил, то значит переопределил ванильный код генерации биомов. Третьего тут не дано.

Наследуй от класса ChunkProviderOverworld. Чтобы все заработало даже ничего добавлять не надо.

Нету их, нету...
Нет, они есть, просто ты сделал так, что они не генерируются. Наследуй от ChunkProviderOverworld, если не можешь разобраться.

И после этого ты говоришь, что у нас все аналогично. Посмотри получше мой код и почитай Генерацию биомов.
 
5,018
47
783
Наследуй от класса ChunkProviderOverworld. Чтобы все заработало даже ничего добавлять не надо.
Спасибо, но мне не нужно чтобы просто что то заработало. Мне нужно чтобы именно мой код заработал. И разобраться я хочу сейчас. И сделать свой чанкпровайдер. Спасибо за помощь)

P.S Я совсем забыл про то что сначала добавлял свои биомы в обычный мир... да, спасибо. Мне в принципе то на обычный мир наплевать, в моем моде он использоваться не будет... Я просто думал что это как ниточка к решению вопроса о том, почему в моем мире не происходит замена верхних слоев на биомные блоки. Скорее всего это как то связано с тем что у меня собственный блок камня. Ведь если поставить ванильный, все и вправду работает.
 
Последнее редактирование:
102
3
77
Мне нужно чтобы именно мой код заработал.
Сам себе жизнь усложняешь. Лучше закрой тему и создай новый вопрос, потому что я уже не понимаю какая у тебя проблема и что ты хочешь сделать, от изначального вопроса тут уже ничего не осталось.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Да уж, странный молодой человек. Ему дали готовое решение, а он уперся в свой говнокод.
Возьми рабочий вариант и изменяй его, а не пытайся слепить снеговика из говна.
 
5,018
47
783
Сам себе жизнь усложняешь.
Мне все равно придется все это делать, просто потом, а не сейчас.

Я решил проблему. Слава АТ! Слава АТ! СЛАВА!
Достаточно было снять final у Biome#generateBiomeTerrain и переопределить его, заменив блок камня на свой.
 
102
3
77
остаточно было снять final у Biome#generateBiomeTerrain и переопределить его, заменив блок камня на свой.
Как бы для этого есть Biome.genTerrainBlocks(...), о котором я уже писал выше и который можно и нужно переопределить. Это единственное место по факту, где вызывается Biome.generateBiomeTerrain(...).
 
5,018
47
783
Как бы для этого есть Biome.genTerrainBlocks(...), о котором я уже писал выше
Я его прекрасно видел и пытался переопределить. Однако почему то сколько бы я его не переопределял, результата не было. Как то это странно вообще говоря... Похожее было с конструктором дименшена: Мне пришлось писать вот так, так как из обычного конструктора попросту не вызывался биомпровайдер...

Java:
    public RealismDimesion() {
        super();
 
    //    this.biomeProvider = new RealismBiomeProvider(world.getSeed(), this.world.getWorldInfo().getTerrainType());
     
    }
    @Override
    public void init() {
        this.hasSkyLight = true;
        this.generateLightBrightnessTable();
        this.biomeProvider = new RealismBiomeProvider(world.getSeed(), this.world.getWorldInfo().getTerrainType());
    }
 
5,018
47
783
Итак, продолжу тему. Ввиду того что мне нужно было чтобы в каждом биоме были свои собственные песок, камень и так далее я полез в метод genBiomeTerrain и вот что у меня получилось
Я задал константы в начале, которые можно использовать в конструкторе.
Java:
@Override
    public void generateBiomeTerrain(World worldIn, Random rand, ChunkPrimer chunkPrimerIn, int x, int z, double noiseVal)
    {
        int i = worldIn.getSeaLevel();
        IBlockState iblockstate = this.topBlock;
        IBlockState fillerBlock = this.fillerBlock;
        IBlockState stoneBlock = this.stoneBlock;
        IBlockState gravelBlock = this.gravelBlock;
        IBlockState sandBlock = this.sandBlock;
        int j = -1;
        int k = (int)(noiseVal / 3.0D + 3.0D + rand.nextDouble() * 0.25D);
        int l = x & 15;
        int i1 = z & 15;
        BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
//это цикл наоборот. Работает с высоты 255 до самого низа
        for (int j1 = 255; j1 >= 0; --j1)
        {
            //j1 - высота по Y. На высоте от 0 до 5 встречаются блоки бедрока.
            if (j1 <= rand.nextInt(5))
            {
                chunkPrimerIn.setBlockState(i1, j1, l, BEDROCK);
            }
            else
            {
                IBlockState iblockstate2 = chunkPrimerIn.getBlockState(i1, j1, l);
//просто получил еще одну переменную для удобства. В принципе она не нужна
                IBlockState iblockstate3 = chunkPrimerIn.getBlockState(i1, j1, l);
              //если встречается материал воздух, то сетается j=-1 и цикл прерывается
  if (iblockstate2.getMaterial() == Material.AIR)
                {
                    j = -1;
                }
//но если находится твердый блок(в ванили это камень, у меня же для упрощения - все обьекты типа Block) то идет следующий кусок
                else if (iblockstate2.getBlock() instanceof Block)
                {

//вот эта вставка создает блоки камня в биоме именно такие, какие мы задали. Важно установить ее до того как начнется замена на землю, //воду, лед, воздух и так далее. Просто проверяем что все блоки которые не воздух заменяются на наш камень. Прикол в том, что если
//поставить этот код в конце, он не будет работать. Ну думаю это и так понятно

                    if(iblockstate3 != Blocks.AIR.getDefaultState()) {
                        chunkPrimerIn.setBlockState(i1, j1, l, stoneBlock);
                    }

//дальше идет выполнение условия, если цикл прервался по этой высоте, но он продолжает выполнятся, я фиг знает как это обьяснить но //как то так
                    if (j == -1)
                    {
                        if (k <= 0)
                        {
                            iblockstate = AIR;
                            stoneBlock = this.stoneBlock;
                        }
                        else if (j1 >= i - 4 && j1 <= i + 1)
                        {
                            iblockstate = this.topBlock;
                            fillerBlock = this.fillerBlock;
                        }

                        if (j1 < i && (iblockstate == null || iblockstate.getMaterial() == Material.AIR))
                        {
//тут в зависимости от температуры биома вся вода сгенеренная ранее будь то озера, реки и т д будет либо замерзать
                            if (this.getTemperature(blockpos$mutableblockpos.setPos(x, j1, z)) < 0.15F)
                            {
                                iblockstate = ICE;
                            }
                            else//либо оставаться водой
                            {
                                iblockstate = WATER;
                            }
                        }
//дальше я пока не смотрел
                        j = k;

                        if (j1 >= i - 1)
                        {
                            chunkPrimerIn.setBlockState(i1, j1, l, iblockstate);
                        }
                        else if (j1 < i - 7 - k)
                        {
                            iblockstate = AIR;
                            stoneBlock = this.stoneBlock;
                            chunkPrimerIn.setBlockState(i1, j1, l, gravelBlock);
                        }
                        else
                        {
                            chunkPrimerIn.setBlockState(i1, j1, l, fillerBlock);
                        }
                    }
                    else if (j > 0)
                    {
                        --j;
                        chunkPrimerIn.setBlockState(i1, j1, l, fillerBlock);

                        if (j == 0 && fillerBlock == sandBlock && k > 1)
                        {
                            j = rand.nextInt(4) + Math.max(0, j1 - 63);
                            fillerBlock = sandBlock;
                        }
                    }
                }
            }
   
        }
    }

В результате получаем удобный кастомизируемый через конструкторы генератор
2019-01-31_01.46.25.png
 
5,018
47
783
@timaxa007 , @Ivasik или кто нибудь еще, перенесите пожалуйста тему в оффтоп, я буду тут флудить своими наблюдениями.
 
3,005
192
592
4,046
63
645
Посмотри получше мой код и почитай Генерацию биомов.
Я ему в личке уже 100500 раз написал про то же самое и дал почитать те же самые гайды...
Эффекта ноль. Он либо не читает, либо не понимает, либо вообще не слушает...
Проще залепить хуком...

P.S. Просто предостерегаю остальных от желания попытаться хоть что-то ему растолковать )
P.P.S. Лайков не ставит, лучшие ответы не отмечает (потому что просто их не видит)
P.P.P.S Наболело XD
 
5,018
47
783
а переопределять final метод это уже норма?
Достаточно было снять final у Biome#generateBiomeTerrain и переопределить его, заменив блок камня на свой.
Лайков не ставит, лучшие ответы не отмечает
Куда я тебе в дискорде лучшие ответы поставлю?) Все твои лучшие ответы только там.
Я этот гайд который ты мне скидывал, прочитал уже давно. Сначала мне нужно было сделать коренную настройку биома, а уже потом накладывать слои на него. Я запомнил все твои советы, про то как и где что заменяется. Но ты меня больше троллил, нежели по настоящему помогал.

Все том мне рассказал Ddoos для меня не было ничего нового. Кроме как того что он указал на то что я регаю в ванильке свои биомы.
Поэтому я никому ничего и не ставил

Возьми рабочий вариант и изменяй его,
С чего бы метод начал работать, если я его тут у себя точно также переопределяю и он не работает? У Ddoosa магический код исправляющий любые ошибки что ли?

Я уже отписал, почему я сделал именно так. Если вам обидно что хотели закидать меня помидорами и у вас не получилось, ну что ж...

Я его прекрасно видел и пытался переопределить. Однако почему то сколько бы я его не переопределял, результата не было. Как то это странно вообще говоря... Похожее было с конструктором дименшена: Мне пришлось писать вот так, так как из обычного конструктора попросту не вызывался биомпровайдер...
 
Последнее редактирование:
4,046
63
645
5,018
47
783
а наставлял на путь истинный...
на свой путь ты меня наставлял, а не на истинный. Истина у каждого своя, знаешь ли:D
Вот ты считаешь недопустимым текстуры больше 16х16. А кто то делает UltraHD пак и играет с 512 на 512 и не парится)
 
Сверху