Example #1
0
    public virtual int GenerateLayer(int x, int z, int heightSoFar, float strength, bool justGetHeight = false)
    {
        if (layerType == LayerType.Structure)
            return heightSoFar;

        if (customTerrainLayer)
        {
            //Not the best place for this but it ensures that custom layers are always initialized before use
            if (customLayer == null)
            {
                var customLayerType = Type.GetType(terrainLayerClassName + ", " + typeof(LayerOverride).Assembly);
                customLayer = (LayerOverride)Activator.CreateInstance(customLayerType);

                customLayer.world = world;
                customLayer.noiseGen = noiseGen;
                customLayer.baseHeight = baseHeight;
                customLayer.frequency = frequency;
                customLayer.amplitude = amplitude;
                customLayer.exponent = exponent;
                customLayer.chanceToSpawnBlock = chanceToSpawnBlock;
                customLayer.blockName = blockName;

                if (layerType == LayerType.Structure)
                    customLayer.structure = structure;
            }

            int newHeight = customLayer.GenerateLayer(x, z, heightSoFar, strength, justGetHeight);
            return newHeight;
        }

        Block blockToPlace = blockName;
        blockToPlace.modified = false;

        if (layerType == LayerType.Chance)
        {
            if (GetNoise(x, -10555, z, 1, 100, 1) < chanceToSpawnBlock)
            {
                if(!justGetHeight)
                    world.SetBlock(new BlockPos(x, heightSoFar, z), blockToPlace, false);

                return heightSoFar + 1;
            }
            else
            {
                return heightSoFar;
            }
        }

        int height = GetNoise(x, 0, z, frequency, amplitude, exponent);
        height += baseHeight;
        height = (int)(height * strength);

        if (!justGetHeight)
        {
            if (layerType == LayerType.Absolute)
            {
                for (int y = heightSoFar; y < height + Config.Env.WorldMinY; y++)
                {
                    world.SetBlock(new BlockPos(x, y, z), blockToPlace, false);
                }
            }
            else //additive or surface
            {
                for (int y = heightSoFar; y < height + heightSoFar; y++)
                {
                    world.SetBlock(new BlockPos(x, y, z), blockToPlace, false);
                }
            }
        }

        if (layerType == LayerType.Additive || layerType == LayerType.Surface)
        {
            return heightSoFar + height;
        }
        else //absolute
        {
            if (Config.Env.WorldMinY + height > heightSoFar)
                return Config.Env.WorldMinY + height;
        }
        return heightSoFar;
    }
Example #2
0
    public virtual int GenerateLayer(int x, int z, int heightSoFar, float strength, bool justGetHeight = false)
    {
        if (layerType == LayerType.Structure)
        {
            return(heightSoFar);
        }

        if (customTerrainLayer)
        {
            //Not the best place for this but it ensures that custom layers are always initialized before use
            if (customLayer == null)
            {
                var customLayerType = Type.GetType(terrainLayerClassName + ", " + typeof(LayerOverride).Assembly);
                customLayer = (LayerOverride)Activator.CreateInstance(customLayerType);

                customLayer.world              = world;
                customLayer.noiseGen           = noiseGen;
                customLayer.baseHeight         = baseHeight;
                customLayer.frequency          = frequency;
                customLayer.amplitude          = amplitude;
                customLayer.exponent           = exponent;
                customLayer.chanceToSpawnBlock = chanceToSpawnBlock;
                customLayer.blockName          = blockName;

                if (layerType == LayerType.Structure)
                {
                    customLayer.structure = structure;
                }
            }

            int newHeight = customLayer.GenerateLayer(x, z, heightSoFar, strength, justGetHeight);
            return(newHeight);
        }

        Block blockToPlace = blockName;

        blockToPlace.modified = false;

        if (layerType == LayerType.Chance)
        {
            if (GetNoise(x, -10555, z, 1, 100, 1) < chanceToSpawnBlock)
            {
                if (!justGetHeight)
                {
                    world.SetBlock(new BlockPos(x, heightSoFar, z), blockToPlace, false);
                }

                return(heightSoFar + 1);
            }
            else
            {
                return(heightSoFar);
            }
        }

        int height = GetNoise(x, 0, z, frequency, amplitude, exponent);

        height += baseHeight;
        height  = (int)(height * strength);

        if (!justGetHeight)
        {
            if (layerType == LayerType.Absolute)
            {
                for (int y = heightSoFar; y < height + Config.Env.WorldMinY; y++)
                {
                    world.SetBlock(new BlockPos(x, y, z), blockToPlace, false);
                }
            }
            else //additive or surface
            {
                for (int y = heightSoFar; y < height + heightSoFar; y++)
                {
                    world.SetBlock(new BlockPos(x, y, z), blockToPlace, false);
                }
            }
        }

        if (layerType == LayerType.Additive || layerType == LayerType.Surface)
        {
            return(heightSoFar + height);
        }
        else //absolute
        {
            if (Config.Env.WorldMinY + height > heightSoFar)
            {
                return(Config.Env.WorldMinY + height);
            }
        }
        return(heightSoFar);
    }