public void initWorldGen()
        {
            LoadGlobalConfig(api);

            rnd       = new Random(api.WorldManager.Seed);
            chunksize = api.WorldManager.ChunkSize;

            treeSupplier.LoadTrees();

            worldheight     = api.WorldManager.MapSizeY;
            chunkMapSizeY   = api.WorldManager.MapSizeY / chunksize;
            regionChunkSize = api.WorldManager.RegionSize / chunksize;

            RockBlockIdsByType = new Dictionary <string, int>();
            RockStrataConfig rockstrata = api.Assets.Get("worldgen/rockstrata.json").ToObject <RockStrataConfig>();

            for (int i = 0; i < rockstrata.Variants.Length; i++)
            {
                Block block = api.World.GetBlock(rockstrata.Variants[i].BlockCode);
                RockBlockIdsByType[block.LastCodePart()] = block.BlockId;
            }
            IAsset asset = api.Assets.Get("worldgen/blockpatches.json");

            bpc = asset.ToObject <BlockPatchConfig>();
            bpc.ResolveBlockIds(api, rockstrata);
        }
        void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata)
        {
            if (BlockCode != null && BlockCode.Path.Length > 0)
            {
                if (BlockCode.Path.Contains("{rocktype}"))
                {
                    BlockIdMapping = new Dictionary <int, int>();
                    for (int i = 0; i < rockstrata.Variants.Length; i++)
                    {
                        if (rockstrata.Variants[i].IsDeposit)
                        {
                            continue;
                        }

                        string rocktype = rockstrata.Variants[i].BlockCode.Path.Split('-')[1];

                        Block rockBlock  = api.World.GetBlock(rockstrata.Variants[i].BlockCode);
                        Block typedBlock = api.World.GetBlock(BlockCode.CopyWithPath(BlockCode.Path.Replace("{rocktype}", rocktype)));

                        if (rockBlock != null && typedBlock != null)
                        {
                            BlockIdMapping[rockBlock.BlockId] = typedBlock.BlockId;
                        }
                    }
                }
                else
                {
                    BlockId = api.WorldManager.GetBlockId(BlockCode);
                }
            }
            else
            {
                BlockCode = null;
            }
        }
Exemple #3
0
        public void initWorldGen(int seedDiff)
        {
            IAsset asset = api.Assets.Get("worldgen/rockstrata.json");

            strata = asset.ToObject <RockStrataConfig>();

            for (int i = 0; i < strata.Variants.Length; i++)
            {
                strata.Variants[i].Init(api.World);
            }

            LoadGlobalConfig(api);

            chunksize  = api.WorldManager.ChunkSize;
            regionSize = api.WorldManager.RegionSize;
            chunkRatio = (float)chunksize / regionSize;

            // Unpadded region noise size in chunks
            regionChunkSize = regionSize / chunksize;

            rand = new Random(api.WorldManager.Seed + seedDiff);

            // Unpadded region noise size in blocks
            int geoProvRegionNoiseSize = regionSize / TerraGenConfig.geoProvMapScale;

            // Amount of regions in all of the map
            regionMapSize = api.WorldManager.MapSizeX / (chunksize * geoProvRegionNoiseSize);

            rockBlockId = (ushort)api.WorldManager.GetBlockId(new AssetLocation("rock-granite"));
            worldHeight = api.WorldManager.MapSizeY;

            distort2dx = new SimplexNoise(new double[] { 14, 9, 6, 3 }, new double[] { 1 / 100.0, 1 / 50.0, 1 / 25.0, 1 / 12.5 }, api.World.SeaLevel + 9876 + seedDiff);
            distort2dz = new SimplexNoise(new double[] { 14, 9, 6, 3 }, new double[] { 1 / 100.0, 1 / 50.0, 1 / 25.0, 1 / 12.5 }, api.World.SeaLevel + 9877 + seedDiff);

            strataNoises = new MapLayerCustomPerlin[strata.Variants.Length];
            for (int i = 0; i < strataNoises.Length; i++)
            {
                RockStratum stratum = strata.Variants[i];

                double[] ampls = (double[])stratum.Amplitudes.Clone();
                double[] freq  = (double[])stratum.Frequencies.Clone();
                double[] th    = (double[])stratum.Thresholds.Clone();

                if (ampls.Length != freq.Length || ampls.Length != th.Length)
                {
                    throw new ArgumentException(string.Format("Bug in Rock stratum {0}: The list of amplitudes ({1} elements), frequencies ({2} elements) and thresholds ({3} elements) are not of the same length!", i, ampls.Length, freq.Length, th.Length));
                }

                for (int j = 0; j < freq.Length; j++)
                {
                    freq[j]  /= TerraGenConfig.rockStrataOctaveScale;
                    ampls[j] *= api.WorldManager.MapSizeY;
                    th[j]    *= api.WorldManager.MapSizeY;
                }

                strataNoises[i] = new MapLayerCustomPerlin(api.World.Seed + 23423 + i + seedDiff, ampls, freq, th);
            }
        }
        public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, Random rnd)
        {
            if (NoiseAmplitudes != null && NoiseFrequencies != null)
            {
                noise = new ClampedSimplexNoise(NoiseAmplitudes, NoiseFrequencies, rnd.Next());
            }

            ResolveBlockIds(api, rockstrata);
        }
        public void initWorldGen()
        {
            regionSize          = sapi.WorldManager.RegionSize;
            chunksize           = sapi.World.BlockAccessor.ChunkSize;
            noiseSizeDensityMap = regionSize / TerraGenConfig.blockPatchesMapScale;

            LoadGlobalConfig(sapi);

            rnd       = new LCGRandom(sapi.WorldManager.Seed - 87698);
            chunksize = sapi.WorldManager.ChunkSize;

            treeSupplier.LoadTrees();

            worldheight     = sapi.WorldManager.MapSizeY;
            chunkMapSizeY   = sapi.WorldManager.MapSizeY / chunksize;
            regionChunkSize = sapi.WorldManager.RegionSize / chunksize;

            RockBlockIdsByType = new Dictionary <string, int>();
            RockStrataConfig rockstrata = sapi.Assets.Get("worldgen/rockstrata.json").ToObject <RockStrataConfig>();

            for (int i = 0; i < rockstrata.Variants.Length; i++)
            {
                Block block = sapi.World.GetBlock(rockstrata.Variants[i].BlockCode);
                RockBlockIdsByType[block.LastCodePart()] = block.BlockId;
            }
            IAsset asset = sapi.Assets.Get("worldgen/blockpatches.json");

            bpc = asset.ToObject <BlockPatchConfig>();

            var blockpatchesfiles = sapi.Assets.GetMany <BlockPatch[]>(sapi.World.Logger, "worldgen/blockpatches/");

            foreach (var patches in blockpatchesfiles.Values)
            {
                bpc.Patches = bpc.Patches.Append(patches);
            }

            bpc.ResolveBlockIds(sapi, rockstrata, rnd);
            treeSupplier.treeGenerators.forestFloorSystem.SetBlockPatches(bpc);


            ITreeAttribute worldConfig = sapi.WorldManager.SaveGame.WorldConfiguration;

            forestMod = worldConfig.GetString("globalForestation").ToFloat(0);

            blockPatchMapGens.Clear();
            foreach (var patch in bpc.Patches)
            {
                if (patch.MapCode == null || blockPatchMapGens.ContainsKey(patch.MapCode))
                {
                    continue;
                }

                int hs   = patch.MapCode.GetHashCode();
                int seed = sapi.World.Seed + 112897 + hs;
                blockPatchMapGens[patch.MapCode] = new MapLayerWobbled(seed, 2, 0.9f, TerraGenConfig.forestMapScale, 4000, -3000);
            }
        }
Exemple #6
0
        public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, LCGRandom rnd, int i)
        {
            List <Block> blocks = new List <Block>();

            for (int j = 0; j < blockCodes.Length; j++)
            {
                AssetLocation code = blockCodes[j];

                if (code.Path.Contains("{rocktype}"))
                {
                    if (BlocksByRockType == null)
                    {
                        BlocksByRockType = new Dictionary <int, Block[]>();
                    }

                    for (int k = 0; k < rockstrata.Variants.Length; k++)
                    {
                        string        rocktype      = rockstrata.Variants[k].BlockCode.Path.Split('-')[1];
                        AssetLocation rocktypedCode = code.CopyWithPath(code.Path.Replace("{rocktype}", rocktype));

                        Block rockBlock = api.World.GetBlock(rockstrata.Variants[k].BlockCode);

                        if (rockBlock != null)
                        {
                            BlocksByRockType[rockBlock.BlockId] = new Block[] { api.World.GetBlock(rocktypedCode) };
                        }
                    }
                }
                else
                {
                    Block block = api.World.GetBlock(code);
                    if (block != null)
                    {
                        blocks.Add(block);
                    }
                    else
                    {
                        api.World.Logger.Warning("Block patch Nr. {0}: Unable to resolve block with code {1}. Will ignore.", i, code);
                    }
                }
            }

            Blocks = blocks.ToArray();

            if (BlockCodeIndex == null)
            {
                BlockCodeIndex = NatFloat.createUniform(0, Blocks.Length);
            }

            if (RandomMapCodePool != null)
            {
                int index = rnd.NextInt(RandomMapCodePool.Length);
                MapCode = RandomMapCodePool[index];
            }
        }
Exemple #7
0
        internal void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata)
        {
            for (int i = 0; i < Patches.Length; i++)
            {
                BlockPatch patch = Patches[i];

                List <Block> blocks = new List <Block>();

                for (int j = 0; j < patch.blockCodes.Length; j++)
                {
                    AssetLocation code = patch.blockCodes[j];

                    if (code.Path.Contains("{rocktype}"))
                    {
                        if (patch.BlocksByRockType == null)
                        {
                            patch.BlocksByRockType = new Dictionary <int, Block[]>();
                        }

                        for (int k = 0; k < rockstrata.Variants.Length; k++)
                        {
                            string        rocktype      = rockstrata.Variants[k].BlockCode.Path.Split('-')[1];
                            AssetLocation rocktypedCode = code.CopyWithPath(code.Path.Replace("{rocktype}", rocktype));

                            Block rockBlock = api.World.GetBlock(rockstrata.Variants[k].BlockCode);

                            if (rockBlock != null)
                            {
                                patch.BlocksByRockType[rockBlock.BlockId] = new Block[] { api.World.GetBlock(rocktypedCode) };
                            }
                        }
                    }
                    else
                    {
                        Block block = api.World.GetBlock(code);
                        if (block != null)
                        {
                            blocks.Add(block);
                        }
                        else
                        {
                            api.World.Logger.Warning("Block patch Nr. {0}: Unable to resolve block with code {1}. Will ignore.", i, code);
                        }
                    }
                }

                patch.Blocks = blocks.ToArray();

                if (patch.BlockCodeIndex == null)
                {
                    patch.BlockCodeIndex = NatFloat.createUniform(0, patch.Blocks.Length);
                }
            }
        }
        internal void Init(ICoreServerAPI api)
        {
            IAsset           asset      = api.Assets.Get("worldgen/rockstrata.json");
            RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>();

            asset            = api.Assets.Get("worldgen/blocklayers.json");
            blockLayerConfig = asset.ToObject <BlockLayerConfig>();
            blockLayerConfig.ResolveBlockIds(api, rockstrata);


            for (int i = 0; i < Structures.Length; i++)
            {
                LCGRandom rand = new LCGRandom(api.World.Seed + i + 512);
                Structures[i].Init(api, blockLayerConfig, rand);
            }
        }
        public void InitWorldGen()
        {
            LoadGlobalConfig(api);

            IAsset           asset      = api.Assets.Get("worldgen/rockstrata.json");
            RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>();

            asset            = api.Assets.Get("worldgen/blocklayers.json");
            blockLayerConfig = asset.ToObject <BlockLayerConfig>();
            blockLayerConfig.ResolveBlockIds(api, rockstrata);

            rnd          = new LCGRandom(api.WorldManager.Seed);
            grassDensity = new ClampedSimplexNoise(new double[] { 4 }, new double[] { 0.5 }, rnd.NextInt());
            grassHeight  = new ClampedSimplexNoise(new double[] { 1.5 }, new double[] { 0.5 }, rnd.NextInt());

            mapheight = api.WorldManager.MapSizeY;
        }
        /// <summary>
        /// Loads and caches the BlockLayerConfig if it's not already loaded. Otherwise
        /// returns the cached value
        /// </summary>
        /// <param name="api"></param>
        /// <returns></returns>
        public static BlockLayerConfig GetInstance(ICoreServerAPI api)
        {
            if (api.ObjectCache.ContainsKey(cacheKey))
            {
                return(api.ObjectCache[cacheKey] as BlockLayerConfig);
            }
            else
            {
                IAsset           asset      = api.Assets.Get("worldgen/rockstrata.json");
                RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>();
                asset = api.Assets.Get("worldgen/blocklayers.json");
                BlockLayerConfig blockLayerConfig = asset.ToObject <BlockLayerConfig>();
                blockLayerConfig.ResolveBlockIds(api, rockstrata);

                api.ObjectCache[cacheKey] = blockLayerConfig;
                return(blockLayerConfig);
            }
        }
Exemple #11
0
        internal void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata, LCGRandom rnd)
        {
            List <BlockPatch> patchesNonTree = new List <BlockPatch>();

            for (int i = 0; i < Patches.Length; i++)
            {
                BlockPatch patch = Patches[i];

                bool handledbyTreegen = patch.Placement == EnumBlockPatchPlacement.OnTrees || patch.Placement == EnumBlockPatchPlacement.UnderTrees;
                if (!handledbyTreegen)
                {
                    patchesNonTree.Add(patch);
                }

                patch.Init(api, rockstrata, rnd, i);
            }

            PatchesNonTree = patchesNonTree.ToArray();
        }
        public void initWorldGen()
        {
            LoadGlobalConfig(api);

            rand             = new LCGRandom(api.WorldManager.Seed - 12);
            searchSize       = 3 * chunksize;
            mapOffset        = chunksize;
            minBoundary      = -chunksize + 1;
            maxBoundary      = 2 * chunksize - 1;
            mapheight        = api.WorldManager.MapSizeY;
            didCheckPosition = new bool[searchSize * searchSize];

            IAsset           asset      = api.Assets.Get("worldgen/rockstrata.json");
            RockStrataConfig rockstrata = asset.ToObject <RockStrataConfig>();

            asset = api.Assets.Get("worldgen/blocklayers.json");
            BlockLayerConfig blockLayerConfig = asset.ToObject <BlockLayerConfig>();

            blockLayerConfig.ResolveBlockIds(api, rockstrata);

            lakebedLayerConfig = blockLayerConfig.LakeBedLayer;
        }
        public void ResolveBlockIds(ICoreServerAPI api, RockStrataConfig rockstrata)
        {
            for (int i = 0; i < Blocklayers.Length; i++)
            {
                Random rnd = new Random(api.WorldManager.Seed + i);

                Blocklayers[i].Init(api, rockstrata, rnd);
            }

            SnowLayer.BlockId = api.WorldManager.GetBlockId(SnowLayer.BlockCode);

            for (int i = 0; i < Tallgrass.BlockCodeByMin.Length; i++)
            {
                Tallgrass.BlockCodeByMin[i].BlockId = api.WorldManager.GetBlockId(Tallgrass.BlockCodeByMin[i].BlockCode);
            }

            for (int i = 0; i < LakeBedLayer.BlockCodeByMin.Length; i++)
            {
                Random rnd = new Random(api.WorldManager.Seed + i);
                LakeBedLayer.BlockCodeByMin[i].Init(api, rockstrata, rnd);
            }
        }
        public void Init(ICoreServerAPI api, BlockLayerConfig config, RockStrataConfig rockstrata, LCGRandom rand)
        {
            this.rand = rand;

            List <BlockSchematicStructure[]> schematics = new List <BlockSchematicStructure[]>();

            for (int i = 0; i < Schematics.Length; i++)
            {
                string   error = "";
                IAsset[] assets;

                if (Schematics[i].EndsWith("*"))
                {
                    assets = api.Assets.GetMany("worldgen/schematics/" + Schematics[i].Substring(0, Schematics[i].Length - 1)).ToArray();
                }
                else
                {
                    assets = new IAsset[] { api.Assets.Get("worldgen/schematics/" + Schematics[i] + ".json") };
                }

                for (int j = 0; j < assets.Length; j++)
                {
                    IAsset asset = assets[j];

                    BlockSchematicStructure schematic = asset.ToObject <BlockSchematicStructure>();


                    if (schematic == null)
                    {
                        api.World.Logger.Warning("Could not load {0}: {1}", Schematics[i], error);
                        continue;
                    }


                    schematic.FromFileName = asset.Name;

                    BlockSchematicStructure[] rotations = new BlockSchematicStructure[4];
                    rotations[0] = schematic;

                    for (int k = 0; k < 4; k++)
                    {
                        if (k > 0)
                        {
                            rotations[k] = rotations[0].Clone();
                            rotations[k].TransformWhilePacked(api.World, EnumOrigin.BottomCenter, k * 90);
                        }
                        rotations[k].blockLayerConfig = config;
                        rotations[k].Init(api.World.BlockAccessor);
                        rotations[k].LoadMetaInformationAndValidate(api.World.BlockAccessor, api.World, schematic.FromFileName);
                    }

                    schematics.Add(rotations);
                }
            }

            this.schematicDatas = schematics.ToArray();


            if (ReplaceWithBlocklayers != null)
            {
                replaceblockids = new int[ReplaceWithBlocklayers.Length];
                for (int i = 0; i < replaceblockids.Length; i++)
                {
                    Block block = api.World.GetBlock(ReplaceWithBlocklayers[i]);
                    if (block == null)
                    {
                        throw new Exception(string.Format("Schematic with code {0} has replace block layer {1} defined, but no such block found!", Code, ReplaceWithBlocklayers[i]));
                    }
                    else
                    {
                        replaceblockids[i] = block.Id;
                    }
                }
            }

            if (InsideBlockCodes != null)
            {
                for (int i = 0; i < InsideBlockCodes.Length; i++)
                {
                    Block block = api.World.GetBlock(InsideBlockCodes[i]);
                    if (block == null)
                    {
                        throw new Exception(string.Format("Schematic with code {0} has inside block {1} defined, but no such block found!", Code, InsideBlockCodes[i]));
                    }
                    else
                    {
                        insideblockids.Add(block.Id);
                    }
                }
            }

            if (ReplaceWithRockType != null)
            {
                resolvedReplaceWithRocktype = new Dictionary <int, Dictionary <int, int> >();

                foreach (var val in ReplaceWithRockType)
                {
                    int sourceBlockId = api.World.GetBlock(val.Key).Id;

                    Dictionary <int, int> blockIdByRockId = new Dictionary <int, int>();

                    foreach (var strat in rockstrata.Variants)
                    {
                        Block         rockBlock   = api.World.GetBlock(strat.BlockCode);
                        AssetLocation resolvedLoc = val.Value.Clone();
                        resolvedLoc.Path = resolvedLoc.Path.Replace("{rock}", rockBlock.LastCodePart());

                        Block resolvedBlock = api.World.GetBlock(resolvedLoc);
                        if (resolvedBlock != null)
                        {
                            blockIdByRockId[rockBlock.Id] = resolvedBlock.Id;

                            Block quartzBlock = api.World.GetBlock(new AssetLocation("ore-quartz-" + rockBlock.LastCodePart()));
                            if (quartzBlock != null)
                            {
                                blockIdByRockId[quartzBlock.Id] = resolvedBlock.Id;
                            }
                        }
                    }

                    resolvedReplaceWithRocktype[sourceBlockId] = blockIdByRockId;
                }
            }
        }
 public void Init(ICoreServerAPI api, RockStrataConfig rockstrata, Random rnd)
 {
     ResolveBlockIds(api, rockstrata);
 }